diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c index 195cb4355a14b10b05b0b50cf293456b5b7b4f75..b08b30491af14982248461caafd62d3a3aa64909 100644 --- a/src/stdio/fgetws.c +++ b/src/stdio/fgetws.c @@ -1,5 +1,6 @@ #include "stdio_impl.h" #include +#include wint_t __fgetwc_unlocked(FILE *); @@ -11,6 +12,10 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) FLOCK(f); + /* Setup a dummy errno so we can detect EILSEQ. This is + * the only way to catch encoding errors in the form of a + * partial character just before EOF. */ + errno = EAGAIN; for (; n; n--) { wint_t c = __fgetwc_unlocked(f); if (c == WEOF) break; @@ -18,7 +23,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) if (c == '\n') break; } *p = 0; - if (ferror(f)) p = s; + if (ferror(f) || errno==EILSEQ) p = s; FUNLOCK(f);