X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhstoresbr.c;h=bcb95eac9426808c02c4e612db599fcd0ca8d22e;hp=f5e3347d3a4d16af89e11147cd0e5a9cd95c6c77;hb=2b7b705f7d986903b6e2190b559e7211e8e79f49;hpb=9b70e8396d50989db2177547515594bc15ee8b17 diff --git a/uip/mhstoresbr.c b/uip/mhstoresbr.c index f5e3347..bcb95ea 100644 --- a/uip/mhstoresbr.c +++ b/uip/mhstoresbr.c @@ -1129,7 +1129,7 @@ next_version (char *file, enum clobber_policy_t clobber_policy) { } for (version = 1; version < max_versions; ++version) { - struct stat st; + int fd; switch (clobber_policy) { case NMH_CLOBBER_AUTO: { @@ -1151,7 +1151,15 @@ next_version (char *file, enum clobber_policy_t clobber_policy) { return NULL; } - if (stat (buffer, &st) == NOTOK) { + /* Actually (try to) create the file here to avoid a race + condition on file naming + creation. This won't solve the + problem with old NFS that doesn't support O_EXCL, though. + Let the umask strip off permissions from 0666 as desired. + That's what fopen () would do if it was creating the file. */ + if ((fd = open (buffer, O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | + S_IROTH | S_IWOTH)) >= 0) { + close (fd); break; } }