diff options
author | Andrey A. Chernov <ache@FreeBSD.org> | 2016-09-01 18:12:53 +0000 |
---|---|---|
committer | Andrey A. Chernov <ache@FreeBSD.org> | 2016-09-01 18:12:53 +0000 |
commit | 88eb1553b0d71ba5b89351e1e32221d7513cd4ae (patch) | |
tree | 84d773524b36c10ea6158608512edaa73544c08d /lib/libc | |
parent | 1dc088ab6981b9f1c8ed6fd71cb9098bd4dca87b (diff) | |
download | src-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.c | 13 |
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); } |