svn commit: r304810 - head/lib/libc/stdio

Andrey A. Chernov ache at FreeBSD.org
Thu Aug 25 17:13:05 UTC 2016


Author: ache
Date: Thu Aug 25 17:13:04 2016
New Revision: 304810
URL: https://svnweb.freebsd.org/changeset/base/304810

Log:
  Don't check for __SERR which may stick from one of any previous stdio
  functions.
  __SERR is for user and the rest of stdio code do not check it
  for error sensing internally, only set it.
  In vf(w)printf.c here it is more easy to save __SERR, clear and restore it.

Modified:
  head/lib/libc/stdio/getdelim.c
  head/lib/libc/stdio/vfprintf.c
  head/lib/libc/stdio/vfwprintf.c

Modified: head/lib/libc/stdio/getdelim.c
==============================================================================
--- head/lib/libc/stdio/getdelim.c	Thu Aug 25 17:07:43 2016	(r304809)
+++ head/lib/libc/stdio/getdelim.c	Thu Aug 25 17:13:04 2016	(r304810)
@@ -125,7 +125,7 @@ getdelim(char ** __restrict linep, size_
 
 	if (fp->_r <= 0 && __srefill(fp)) {
 		/* If fp is at EOF already, we just need space for the NUL. */
-		if (__sferror(fp) || expandtofit(linep, 1, linecapp))
+		if (!__sfeof(fp) || expandtofit(linep, 1, linecapp))
 			goto error;
 		FUNLOCKFILE(fp);
 		(*linep)[0] = '\0';
@@ -137,7 +137,7 @@ getdelim(char ** __restrict linep, size_
 		if (sappend(linep, &linelen, linecapp, fp->_p, fp->_r))
 			goto error;
 		if (__srefill(fp)) {
-			if (__sferror(fp))
+			if (!__sfeof(fp))
 				goto error;
 			goto done;	/* hit EOF */
 		}

Modified: head/lib/libc/stdio/vfprintf.c
==============================================================================
--- head/lib/libc/stdio/vfprintf.c	Thu Aug 25 17:07:43 2016	(r304809)
+++ head/lib/libc/stdio/vfprintf.c	Thu Aug 25 17:13:04 2016	(r304810)
@@ -364,6 +364,7 @@ __vfprintf(FILE *fp, locale_t locale, co
 	int nextarg;            /* 1-based argument index */
 	va_list orgap;          /* original argument pointer */
 	char *convbuf;		/* wide to multibyte conversion result */
+	int savserr;
 
 	static const char xdigs_lower[16] = "0123456789abcdef";
 	static const char xdigs_upper[16] = "0123456789ABCDEF";
@@ -460,6 +461,9 @@ __vfprintf(FILE *fp, locale_t locale, co
 		return (EOF);
 	}
 
+	savserr = fp->_flags & __SERR;
+	fp->_flags &= ~__SERR;
+
 	convbuf = NULL;
 	fmt = (char *)fmt0;
 	argtable = NULL;
@@ -1031,6 +1035,8 @@ error:
 		free(convbuf);
 	if (__sferror(fp))
 		ret = EOF;
+	else
+		fp->_flags |= savserr;
 	if ((argtable != NULL) && (argtable != statargtable))
 		free (argtable);
 	return (ret);

Modified: head/lib/libc/stdio/vfwprintf.c
==============================================================================
--- head/lib/libc/stdio/vfwprintf.c	Thu Aug 25 17:07:43 2016	(r304809)
+++ head/lib/libc/stdio/vfwprintf.c	Thu Aug 25 17:13:04 2016	(r304810)
@@ -444,6 +444,7 @@ __vfwprintf(FILE *fp, locale_t locale, c
 	int nextarg;		/* 1-based argument index */
 	va_list orgap;		/* original argument pointer */
 	wchar_t *convbuf;	/* multibyte to wide conversion result */
+	int savserr;
 
 	static const char xdigs_lower[16] = "0123456789abcdef";
 	static const char xdigs_upper[16] = "0123456789ABCDEF";
@@ -536,6 +537,9 @@ __vfwprintf(FILE *fp, locale_t locale, c
 		return (EOF);
 	}
 
+	savserr = fp->_flags & __SERR;
+	fp->_flags &= ~__SERR;
+
 	convbuf = NULL;
 	fmt = (wchar_t *)fmt0;
 	argtable = NULL;
@@ -1096,6 +1100,8 @@ error:
 		free(convbuf);
 	if (__sferror(fp))
 		ret = EOF;
+	else
+		fp->_flags |= savserr;
 	if ((argtable != NULL) && (argtable != statargtable))
 		free (argtable);
 	return (ret);


More information about the svn-src-all mailing list