瀏覽代碼

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.

Manuel Novoa III 22 年之前
父節點
當前提交
dba553769e
共有 1 個文件被更改,包括 18 次插入8 次删除
  1. 18 8
      libc/stdio/stdio.c

+ 18 - 8
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 */
 }