]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix freopen handling of ,ccs= (bug 23675)
authorJoseph Myers <josmyers@redhat.com>
Thu, 5 Sep 2024 20:08:10 +0000 (20:08 +0000)
committerJoseph Myers <josmyers@redhat.com>
Thu, 5 Sep 2024 20:08:10 +0000 (20:08 +0000)
As reported in bug 23675 and shown up in the recently added tests of
different cases of freopen (relevant part of the test currently
conditioned under #if 0 to avoid a failure resulting from this bug),
freopen wrongly forces the stream to unoriented even when a mode with
,ccs= is specified, though such a mode is supposed to result in a
wide-oriented stream.  Move the clearing of _mode to before the actual
reopening occurs, so that the main fopen implementation can leave a
wide-oriented stream in the ,ccs= case.

Tested for x86_64.

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

index ceeff8f2acb6333fea3fc4d81d029f610ab71f83..00f26ad578afc1b1cc275acb421463e3b20825b7 100644 (file)
@@ -66,6 +66,7 @@ freopen (const char *filename, const char *mode, FILE *fp)
       fp->_flags2 &= ~(_IO_FLAGS2_MMAP
                       | _IO_FLAGS2_NOTCANCEL
                       | _IO_FLAGS2_CLOEXEC);
+      fp->_mode = 0;
       result = _IO_old_file_fopen (fp, gfilename, mode);
     }
   else
@@ -78,6 +79,7 @@ freopen (const char *filename, const char *mode, FILE *fp)
       fp->_flags2 &= ~(_IO_FLAGS2_MMAP
                       | _IO_FLAGS2_NOTCANCEL
                       | _IO_FLAGS2_CLOEXEC);
+      fp->_mode = 0;
       result = _IO_file_fopen (fp, gfilename, mode, 1);
       if (result != NULL)
        result = __fopen_maybe_mmap (result);
@@ -85,9 +87,6 @@ freopen (const char *filename, const char *mode, FILE *fp)
   fp->_flags2 &= ~_IO_FLAGS2_NOCLOSE;
   if (result != NULL)
     {
-      /* unbound stream orientation */
-      result->_mode = 0;
-
       if (fd != -1 && _IO_fileno (result) != fd)
        {
          /* At this point we have both file descriptors already allocated,
index 3a314aca5ce808caccb16efa8c2b11ff7bc6dacf..77c0dd3fdf3c349457f4c8a4312acf41d49ae976 100644 (file)
@@ -59,15 +59,13 @@ freopen64 (const char *filename, const char *mode, FILE *fp)
   fp->_flags2 &= ~(_IO_FLAGS2_MMAP
                   | _IO_FLAGS2_NOTCANCEL
                   | _IO_FLAGS2_CLOEXEC);
+  fp->_mode = 0;
   result = _IO_file_fopen (fp, gfilename, mode, 0);
   fp->_flags2 &= ~_IO_FLAGS2_NOCLOSE;
   if (result != NULL)
     result = __fopen_maybe_mmap (result);
   if (result != NULL)
     {
-      /* unbound stream orientation */
-      result->_mode = 0;
-
       if (fd != -1 && _IO_fileno (result) != fd)
        {
          /* At this point we have both file descriptors already allocated,
index 5dad41c76b02e6de599acc64b66cbbfe83fd230a..74c3125fca697fe321dfe19e87656f05732a1b05 100644 (file)
@@ -386,13 +386,8 @@ do_test (void)
   fp = xfopen (file2, "w,ccs=iso-8859-1");
   ret = fputws (L"\xc0\xc1", fp);
   TEST_VERIFY (ret >= 0);
-#if 0 /* Doesn't work (bug 23675).  */
   fp = FREOPEN (file1, "r,ccs=utf-8", fp);
   TEST_VERIFY_EXIT (fp != NULL);
-#else /* Works instead.  */
-  xfclose (fp);
-  fp = xfopen (file1, "r,ccs=utf-8");
-#endif
   wc = fgetwc (fp);
   TEST_COMPARE (wc, (wint_t) 0xc0);
   wc = fgetwc (fp);