From: Manuel Novoa III Date: Tue, 24 Jun 2003 04:07:40 +0000 (-0000) Subject: Change 'undefined behavior' of fflush() on readonly or reading streams X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=dba553769ed6437444b635ba8818e5a3cb252e00;p=uclinux-h8%2FuClibc.git Change 'undefined behavior' of fflush() on readonly or reading streams 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. --- diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c index eec8bdda3..9a7afbc85 100644 --- a/libc/stdio/stdio.c +++ b/libc/stdio/stdio.c @@ -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 */ }