aboutsummaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>2016-09-01 18:12:53 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>2016-09-01 18:12:53 +0000
commit88eb1553b0d71ba5b89351e1e32221d7513cd4ae (patch)
tree84d773524b36c10ea6158608512edaa73544c08d /lib/libc
parent1dc088ab6981b9f1c8ed6fd71cb9098bd4dca87b (diff)
downloadsrc-88eb1553b0d71ba5b89351e1e32221d7513cd4ae.tar.gz
src-88eb1553b0d71ba5b89351e1e32221d7513cd4ae.zip
If error happens, don't overwrite original errno comes from __mbrtowc()
and __srefill(). MFC after: 3 days
Notes
Notes: svn path=/head/; revision=305219
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/stdio/fgetwc.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c
index cf649fd841fe..3074d441f9f6 100644
--- a/lib/libc/stdio/fgetwc.c
+++ b/lib/libc/stdio/fgetwc.c
@@ -84,9 +84,10 @@ __fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale)
return (WEOF);
do {
nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs);
- if (nconv == (size_t)-1)
- break;
- else if (nconv == (size_t)-2)
+ if (nconv == (size_t)-1) {
+ fp->_flags |= __SERR;
+ return (WEOF);
+ } else if (nconv == (size_t)-2)
continue;
else if (nconv == 0) {
fp->_p++;
@@ -100,7 +101,9 @@ __fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale)
return (wc);
}
} while (__srefill(fp) == 0);
- fp->_flags |= __SERR;
- errno = EILSEQ;
+ if (__sfeof(fp)) {
+ fp->_flags |= __SERR;
+ errno = EILSEQ;
+ }
return (WEOF);
}