Ingo Schwarze <schwa...@usta.de> writes:

> Hi,
>
> i just noticed a bug in fgetwc(3) in our libc, the function used to
> implement getwc(3), getwchar(3), getws(3), getwln(3) and the wscanf(3)
> family of functions.  In case of an encoding error, it does not set
> the error indicator, such that a program correctly checking ferror(3)
> after WEOF may miss the error.
>
> Our manual says:
>
>      If the stream is at end-of-file or a read error occurs, the
>      routines return WEOF.  The routines feof(3) and ferror(3) must be
>      used to distinguish between end-of-file and error.
>
> POSIX is even more explicit:
>
>      If an encoding error occurs, the error indicator for the stream
>      shall be set, fgetwc() shall return WEOF, and shall set errno
>      to indicate the error.
>
> Besides, setting errno is pointless; mbrtowc(3) already did that,
> and the standard requires it to do so.
>
> OK?

ok jca@

>   Ingo
>
>
> Index: stdio/fgetwc.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/stdio/fgetwc.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 fgetwc.c
> --- stdio/fgetwc.c    31 Aug 2015 02:53:57 -0000      1.5
> +++ stdio/fgetwc.c    23 Dec 2015 17:05:42 -0000
> @@ -69,7 +69,7 @@ __fgetwc_unlock(FILE *fp)
>               c = ch;
>               size = mbrtowc(&wc, &c, 1, st);
>               if (size == (size_t)-1) {
> -                     errno = EILSEQ;
> +                     fp->_flags |= __SERR;
>                       return WEOF;
>               }
>       } while (size == (size_t)-2);
>


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to