make-file: Pass O_BINARY or O_TEXT to open() call in replace_file_start().
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 2 Sep 2020 04:42:35 +0000 (21:42 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 2 Sep 2020 04:42:35 +0000 (21:42 -0700)
It's hard to imagine why this would make a difference on a real system,
because the file descriptor obtained from open() is passed to fdopen(),
which is documented to determine whether the stream is text or binary
based on the mode string.  However, bug #40223 implies that it makes a
difference.  I hope that this commit fixes the problem (if any!).

Thanks to the anonymous submitter of bug #40223.

src/data/make-file.c

index fdbb4643ebf7bb5e35ad219a81d4ad76f2384440..a1a541a5d0fb81c6c8938050ce6c3339f1ab31d5 100644 (file)
@@ -265,7 +265,10 @@ replace_file_start (const struct file_handle *fh, const char *mode,
       rf->tmp_name = convert_to_filename_encoding (rf->tmp_name_verbatim, strlen (rf->tmp_name_verbatim), fh_get_file_name_encoding (fh));
 
       /* Create file by that name. */
-      fd = Topen (rf->tmp_name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, permissions);
+      bool binary = strchr (mode, 'b') != NULL;
+      fd = Topen (rf->tmp_name,
+                  O_WRONLY | O_CREAT | O_EXCL | (binary ? O_BINARY : O_TEXT),
+                  permissions);
       if (fd >= 0)
         break;
       if (errno != EEXIST)