From: Theodore Ts'o Date: Sat, 19 Sep 2015 01:37:53 +0000 (-0400) Subject: subst: work around an NFS bug X-Git-Tag: v1.43-WIP-2016-03-15~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5a82003d1b3b7ea01f60dadb49c3bbc60e4ebb7;p=thirdparty%2Fe2fsprogs.git subst: work around an NFS bug When running on NFS, opening files with 0444 perms for writing can sometimes fail. This is arguably an NFS server bug, but work around it by creating the file with 0644 permissions, and only change the permissions to be 0444 right before we close the file. URL: https://bugs.gentoo.org/550986 Reported-by: Mike Frysinger Signed-off-by: Theodore Ts'o --- diff --git a/util/subst.c b/util/subst.c index f36adb4d8..70dc0bc12 100644 --- a/util/subst.c +++ b/util/subst.c @@ -319,7 +319,7 @@ int main(int argc, char **argv) { char line[2048]; int c; - int fd; + int fd, ofd = -1; FILE *in, *out, *old = NULL; char *outfn = NULL, *newfn = NULL; int verbose = 0; @@ -370,12 +370,12 @@ int main(int argc, char **argv) } strcpy(newfn, outfn); strcat(newfn, ".new"); - fd = open(newfn, O_CREAT|O_TRUNC|O_RDWR, 0444); - if (fd < 0) { + ofd = open(newfn, O_CREAT|O_TRUNC|O_RDWR, 0644); + if (ofd < 0) { perror(newfn); exit(1); } - out = fdopen(fd, "w+"); + out = fdopen(ofd, "w+"); if (!out) { perror("fdopen"); exit(1); @@ -429,12 +429,16 @@ int main(int argc, char **argv) printf("Using original atime\n"); set_utimes(outfn, fileno(old), tv); } + if (ofd >= 0) + (void) fchmod(ofd, 0444); fclose(out); if (unlink(newfn) < 0) perror("unlink"); } else { if (verbose) printf("Creating or replacing %s.\n", outfn); + if (ofd >= 0) + (void) fchmod(ofd, 0444); fclose(out); if (old) fclose(old);