svn commit: r305403 - stable/10/lib/libc/stdio
Andrey A. Chernov
ache at FreeBSD.org
Mon Sep 5 01:57:33 UTC 2016
Author: ache
Date: Mon Sep 5 01:57:32 2016
New Revision: 305403
URL: https://svnweb.freebsd.org/changeset/base/305403
Log:
MFC r305241
fgetwc(3) may set both __SEOF and __SERR at once (in case of incomplete
sequence near EOF), so we can't just check for
(wc == WEOF && !__sfeof(fp)) and must relay on __sferror(fp) with
__SERR clearing/restoring.
Modified:
stable/10/lib/libc/stdio/fgetwln.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/lib/libc/stdio/fgetwln.c
==============================================================================
--- stable/10/lib/libc/stdio/fgetwln.c Mon Sep 5 00:41:17 2016 (r305402)
+++ stable/10/lib/libc/stdio/fgetwln.c Mon Sep 5 01:57:32 2016 (r305403)
@@ -47,11 +47,16 @@ fgetwln_l(FILE * __restrict fp, size_t *
{
wint_t wc;
size_t len;
+ int savserr;
+
FIX_LOCALE(locale);
FLOCKFILE(fp);
ORIENT(fp, 1);
+ savserr = fp->_flags & __SERR;
+ fp->_flags &= ~__SERR;
+
len = 0;
while ((wc = __fgetwc(fp, locale)) != WEOF) {
#define GROW 512
@@ -64,7 +69,12 @@ fgetwln_l(FILE * __restrict fp, size_t *
if (wc == L'\n')
break;
}
- if (len == 0 || (wc == WEOF && !__sfeof(fp)))
+ /* fgetwc(3) may set both __SEOF and __SERR at once. */
+ if (__sferror(fp))
+ goto error;
+
+ fp->_flags |= savserr;
+ if (len == 0)
goto error;
FUNLOCKFILE(fp);
More information about the svn-src-all
mailing list