Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Aug 2016 15:44:55 +0000 (UTC)
From:      "Andrey A. Chernov" <ache@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r304607 - head/lib/libc/stdio
Message-ID:  <201608221544.u7MFitOq094721@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ache
Date: Mon Aug 22 15:44:54 2016
New Revision: 304607
URL: https://svnweb.freebsd.org/changeset/base/304607

Log:
  Fix error processing.
  1) Don't forget to set __SERR on __slbexpand() error.
  2) Check for __fgetwc() errors using errno. Don't check for __SERR
  as PR suggested, it user-visible flag which can stick from previous
  functions and stdio code don't check it for this purpose.
  
  PR:     212033
  MFC after:      3 days

Modified:
  head/lib/libc/stdio/fgetwln.c

Modified: head/lib/libc/stdio/fgetwln.c
==============================================================================
--- head/lib/libc/stdio/fgetwln.c	Mon Aug 22 15:27:37 2016	(r304606)
+++ head/lib/libc/stdio/fgetwln.c	Mon Aug 22 15:44:54 2016	(r304607)
@@ -33,6 +33,7 @@
 __FBSDID("$FreeBSD$");
 
 #include "namespace.h"
+#include <errno.h>
 #include <stdio.h>
 #include <wchar.h>
 #include "un-namespace.h"
@@ -47,12 +48,15 @@ fgetwln_l(FILE * __restrict fp, size_t *
 {
 	wint_t wc;
 	size_t len;
+	int saverrno;
 	FIX_LOCALE(locale);
 
 	FLOCKFILE(fp);
 	ORIENT(fp, 1);
 
 	len = 0;
+	saverrno = errno;
+	errno = 0;
 	while ((wc = __fgetwc(fp, locale)) != WEOF) {
 #define	GROW	512
 		if (len * sizeof(wchar_t) >= fp->_lb._size &&
@@ -61,19 +65,27 @@ fgetwln_l(FILE * __restrict fp, size_t *
 		*((wchar_t *)fp->_lb._base + len++) = wc;
 		if (wc == L'\n')
 			break;
+		errno = 0;
 	}
-	if (len == 0)
+	if (wc == WEOF && errno != 0)
 		goto error;
+	if (errno == 0)
+		errno = saverrno;
+	if (len == 0)
+		goto eof;
 
 	FUNLOCKFILE(fp);
 	*lenp = len;
 	return ((wchar_t *)fp->_lb._base);
 
 error:
+	fp->_flags |= __SERR;
+eof:
 	FUNLOCKFILE(fp);
 	*lenp = 0;
 	return (NULL);
 }
+
 wchar_t *
 fgetwln(FILE * __restrict fp, size_t *lenp)
 {



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