From: Ben Gras Date: Tue, 11 Dec 2012 02:50:04 +0000 (+0100) Subject: pax: workaround for mkstemp() and long filenames X-Git-Tag: v3.2.1~155 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/man.dnssec-dsfromkey.html?a=commitdiff_plain;h=faa032f15c74f1c2c01991e130cfad44858bdc41;p=minix.git pax: workaround for mkstemp() and long filenames . symptom: mkstemp() looping forever trying to find a unique filename . reported by pikpik as "BSDTar Endless Extraction of NCurses' Distfiles" --- diff --git a/bin/pax/file_subs.c b/bin/pax/file_subs.c index e3707ca5a..ea7a66a8b 100644 --- a/bin/pax/file_subs.c +++ b/bin/pax/file_subs.c @@ -160,8 +160,23 @@ file_creat(ARCHD *arcn, int write_to_hardlink) * in the path until chk_path() finds that it cannot fix * anything further. if that happens we just give up. */ +#ifdef __minix + { + /* For minix, generate the temporary filename + * conservatively - just write Xes into the last component. + * There is space because of the malloc(). + */ + int cc; + char *last_slash; + strcpy(arcn->tmp_name, arcn->name); + if(!(last_slash = strrchr(arcn->tmp_name, '/'))) + strcpy(arcn->tmp_name, "XXXXXX"); + else strcpy(last_slash+1, "XXXXXX"); + } +#else (void)snprintf(arcn->tmp_name, arcn->nlen + 8, "%s.XXXXXX", arcn->name); +#endif fd = mkstemp(arcn->tmp_name); if (fd >= 0) break;