]> sourceware.org Git - glibc.git/commitdiff
Clear flags2 flags set from mode in freopen (bug 32134)
authorJoseph Myers <josmyers@redhat.com>
Thu, 5 Sep 2024 11:15:29 +0000 (11:15 +0000)
committerJoseph Myers <josmyers@redhat.com>
Thu, 5 Sep 2024 11:15:29 +0000 (11:15 +0000)
As reported in bug 32134, freopen does not clear the flags set in
fp->_flags2 by the "e", "m" or "c" mode characters.  Clear these so
that they can be set or not as appropriate from the mode string passed
to freopen.  The relevant test for "e" in tst-freopen2-main.c is
enabled accordingly; "c" is expected to be covered in a separately
written test (and while tst-freopen2-main.c does include transitions
to and from "m", that's not really a semantic flag intended to result
in behaving in an observably different way).

Tested for x86_64.

libio/freopen.c
libio/freopen64.c
stdio-common/tst-freopen2-main.c

index c7e36db7758c8f3b15e4519e35389ca11f04459c..f6c943ddf82e399ce476434754d29498460e5fd2 100644 (file)
@@ -63,6 +63,9 @@ freopen (const char *filename, const char *mode, FILE *fp)
         up here. */
       _IO_old_file_close_it (fp);
       _IO_JUMPS_FUNC_UPDATE (fp, &_IO_old_file_jumps);
+      fp->_flags2 &= ~(_IO_FLAGS2_MMAP
+                      | _IO_FLAGS2_NOTCANCEL
+                      | _IO_FLAGS2_CLOEXEC);
       result = _IO_old_file_fopen (fp, gfilename, mode);
     }
   else
@@ -72,6 +75,9 @@ freopen (const char *filename, const char *mode, FILE *fp)
       _IO_JUMPS_FILE_plus (fp) = &_IO_file_jumps;
       if (_IO_vtable_offset (fp) == 0 && fp->_wide_data != NULL)
        fp->_wide_data->_wide_vtable = &_IO_wfile_jumps;
+      fp->_flags2 &= ~(_IO_FLAGS2_MMAP
+                      | _IO_FLAGS2_NOTCANCEL
+                      | _IO_FLAGS2_CLOEXEC);
       result = _IO_file_fopen (fp, gfilename, mode, 1);
       if (result != NULL)
        result = __fopen_maybe_mmap (result);
index 9a6d5ed8016b6ed690b0426272283cb27540bee6..0f3cb163313184258aee98353561a27d537cc9c9 100644 (file)
@@ -56,6 +56,9 @@ freopen64 (const char *filename, const char *mode, FILE *fp)
   _IO_JUMPS_FILE_plus (fp) = &_IO_file_jumps;
   if (_IO_vtable_offset (fp) == 0 && fp->_wide_data != NULL)
     fp->_wide_data->_wide_vtable = &_IO_wfile_jumps;
+  fp->_flags2 &= ~(_IO_FLAGS2_MMAP
+                  | _IO_FLAGS2_NOTCANCEL
+                  | _IO_FLAGS2_CLOEXEC);
   result = _IO_file_fopen (fp, gfilename, mode, 0);
   fp->_flags2 &= ~_IO_FLAGS2_NOCLOSE;
   if (result != NULL)
index 22b21afebf7095633bbdd28222a2b492ca769e59..5dad41c76b02e6de599acc64b66cbbfe83fd230a 100644 (file)
@@ -308,9 +308,7 @@ do_test (void)
   TEST_VERIFY_EXIT (fp != NULL);
   ret = fcntl (fileno (fp), F_GETFD);
   TEST_VERIFY (ret != -1);
-#if 0 /* Fails to clear FD_CLOEXEC (bug 32134).  */
   TEST_COMPARE (ret & FD_CLOEXEC, 0);
-#endif
   TEST_COMPARE_FILE_STRING (fp, "plustomore");
   xfclose (fp);
   END_TEST;
This page took 0.039689 seconds and 5 git commands to generate.