svn commit: r305406 - head/lib/libc/stdio
Andrey A. Chernov
ache at FreeBSD.org
Mon Sep 5 03:37:29 UTC 2016
Author: ache
Date: Mon Sep 5 03:37:28 2016
New Revision: 305406
URL: https://svnweb.freebsd.org/changeset/base/305406
Log:
Fix errors handling.
MFC after: 3 days
Modified:
head/lib/libc/stdio/fgetws.c
Modified: head/lib/libc/stdio/fgetws.c
==============================================================================
--- head/lib/libc/stdio/fgetws.c Mon Sep 5 03:21:31 2016 (r305405)
+++ head/lib/libc/stdio/fgetws.c Mon Sep 5 03:37:28 2016 (r305406)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
wchar_t *
fgetws_l(wchar_t * __restrict ws, int n, FILE * __restrict fp, locale_t locale)
{
+ int sret;
wchar_t *wsp;
size_t nconv;
const char *src;
@@ -56,23 +57,27 @@ fgetws_l(wchar_t * __restrict ws, int n,
ORIENT(fp, 1);
if (n <= 0) {
+ fp->_flags |= __SERR;
errno = EINVAL;
goto error;
}
if (fp->_r <= 0 && __srefill(fp))
- /* EOF */
+ /* EOF or ferror */
goto error;
wsp = ws;
+ sret = 0;
do {
src = fp->_p;
nl = memchr(fp->_p, '\n', fp->_r);
nconv = l->__mbsnrtowcs(wsp, &src,
nl != NULL ? (nl - fp->_p + 1) : fp->_r,
n - 1, &fp->_mbstate);
- if (nconv == (size_t)-1)
+ if (nconv == (size_t)-1) {
/* Conversion error */
+ fp->_flags |= __SERR;
goto error;
+ }
if (src == NULL) {
/*
* We hit a null byte. Increment the character count,
@@ -89,12 +94,18 @@ fgetws_l(wchar_t * __restrict ws, int n,
n -= nconv;
wsp += nconv;
} while (wsp[-1] != L'\n' && n > 1 && (fp->_r > 0 ||
- __srefill(fp) == 0));
- if (wsp == ws)
- /* EOF */
+ (sret = __srefill(fp)) == 0));
+ if (sret && !__sfeof(fp))
+ /* ferror */
goto error;
- if (!l->__mbsinit(&fp->_mbstate))
+ if (!l->__mbsinit(&fp->_mbstate)) {
/* Incomplete character */
+ fp->_flags |= __SERR;
+ errno = EILSEQ;
+ goto error;
+ }
+ if (sret)
+ /* EOF */
goto error;
*wsp = L'\0';
FUNLOCKFILE(fp);
@@ -105,6 +116,7 @@ error:
FUNLOCKFILE(fp);
return (NULL);
}
+
wchar_t *
fgetws(wchar_t * __restrict ws, int n, FILE * __restrict fp)
{
More information about the svn-src-head
mailing list