OSDN Git Service

Change 'undefined behavior' of fflush() on readonly or reading streams
authorManuel Novoa III <mjn3@codepoet.org>
Tue, 24 Jun 2003 04:07:40 +0000 (04:07 -0000)
committerManuel Novoa III <mjn3@codepoet.org>
Tue, 24 Jun 2003 04:07:40 +0000 (04:07 -0000)
to match that of current glibc; i.e. don't do anything and return success.
Apparently, php calls fflush() on a file opened as readonly before trying
to read.  Eventually I'll add some config options to flag this and several
other instances of nonportable code.

libc/stdio/stdio.c

index eec8bdd..9a7afbc 100644 (file)
@@ -2210,14 +2210,18 @@ int fflush_unlocked(register FILE *stream)
                if (_stdio_fwrite(NULL, 0, stream) > 0) { /* flush buffer contents. */
                        rv = -1;                        /* Not all chars written. */
                }
-       } else if (stream->modeflags & __FLAG_READONLY) {
-               /* According to info, glibc returns an error when the file is opened
-                * in read-only mode.
-                * ANSI/ISO says behavior in this case is undefined but also says you
-                * shouldn't flush a stream you were reading from. */
-               stream->modeflags |= __FLAG_ERROR; /* TODO - check glibc behavior */
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning add option to test for undefined behavior of fflush
+#endif /* __UCLIBC_MJN3_ONLY__ */
+#if 0
+       } else if (stream->modeflags & (__FLAG_READING|__FLAG_READONLY)) {
+               /* ANSI/ISO says behavior in this case is undefined but also says you
+                * shouldn't flush a stream you were reading from.  As usual, glibc
+                * caters to broken programs and simply ignores this. */
+               stream->modeflags |= __FLAG_ERROR;
                __set_errno(EBADF);
                rv = -1;
+#endif
        }
 
 #ifndef NDEBUG
@@ -2235,11 +2239,17 @@ int fflush_unlocked(register FILE *stream)
        }
 #endif
 
-       /* TODO -- check glibc behavior regarding error indicator */
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning add option to test for undefined behavior of fflush
+#endif /* __UCLIBC_MJN3_ONLY__ */
+#if 0
        return ((stream != NULL)
-                       && (stream->modeflags & __FLAG_READONLY)
+                       && (stream->modeflags & (__FLAG_READING|__FLAG_READONLY))
                        ? ((stream->modeflags |= __FLAG_ERROR), __set_errno(EBADF), EOF)
                        : 0 );
+#else
+       return 0;
+#endif
 
 #endif /* __STDIO_BUFFERS */
 }