Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Aug 2014 01:29:50 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r270035 - stable/10/lib/libc/stdio
Message-ID:  <201408160129.s7G1TojV024013@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Sat Aug 16 01:29:49 2014
New Revision: 270035
URL: http://svnweb.freebsd.org/changeset/base/270035

Log:
  MFC	r268924:
  Update fflush(3) to return success on a read-only stream.
  
  This is done for compliance with SUSv3. The changes cause
  no secondary effects in the gnulib tests (we pass them).
  
  Obtained from:	Apple Inc. (Libc 997.90.3 with changes)
  Reviewed by:	bde
  Phabric:	D440

Modified:
  stable/10/lib/libc/stdio/fflush.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/stdio/fflush.c
==============================================================================
--- stable/10/lib/libc/stdio/fflush.c	Sat Aug 16 01:06:23 2014	(r270034)
+++ stable/10/lib/libc/stdio/fflush.c	Sat Aug 16 01:29:49 2014	(r270035)
@@ -60,7 +60,7 @@ fflush(FILE *fp)
 
 	/*
 	 * There is disagreement about the correct behaviour of fflush()
-	 * when passed a file which is not open for reading.  According to
+	 * when passed a file which is not open for writing.  According to
 	 * the ISO C standard, the behaviour is undefined.
 	 * Under linux, such an fflush returns success and has no effect;
 	 * under Windows, such an fflush is documented as behaving instead
@@ -68,11 +68,13 @@ fflush(FILE *fp)
 	 * Given that applications may be written with the expectation of
 	 * either of these two behaviours, the only safe (non-astonishing)
 	 * option is to return EBADF and ask that applications be fixed.
+	 * SUSv3 now requires that fflush() returns success on a read-only
+	 * stream.
+	 *
 	 */
-	if ((fp->_flags & (__SWR | __SRW)) == 0) {
-		errno = EBADF;
-		retval = EOF;
-	} else
+	if ((fp->_flags & (__SWR | __SRW)) == 0)
+		retval = 0;
+	else
 		retval = __sflush(fp);
 	FUNLOCKFILE(fp);
 	return (retval);
@@ -89,10 +91,9 @@ __fflush(FILE *fp)
 
 	if (fp == NULL)
 		return (_fwalk(sflush_locked));
-	if ((fp->_flags & (__SWR | __SRW)) == 0) {
-		errno = EBADF;
-		retval = EOF;
-	} else
+	if ((fp->_flags & (__SWR | __SRW)) == 0)
+		retval = 0;
+	else
 		retval = __sflush(fp);
 	return (retval);
 }
@@ -122,6 +123,12 @@ __sflush(FILE *fp)
 	for (; n > 0; n -= t, p += t) {
 		t = _swrite(fp, (char *)p, n);
 		if (t <= 0) {
+			/* Reset _p and _w. */
+			if (p > fp->_p)	/* Some was written. */
+				memmove(fp->_p, p, n);
+			fp->_p += n;
+			if ((fp->_flags & (__SLBF | __SNBF)) == 0)
+				fp->_w -= n;
 			fp->_flags |= __SERR;
 			return (EOF);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408160129.s7G1TojV024013>