diff options
Diffstat (limited to 'src/stdio')
| -rw-r--r-- | src/stdio/fgetws.c | 7 | 
1 files changed, 6 insertions, 1 deletions
| diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c index 195cb435..b08b3049 100644 --- a/src/stdio/fgetws.c +++ b/src/stdio/fgetws.c @@ -1,5 +1,6 @@  #include "stdio_impl.h"  #include <wchar.h> +#include <errno.h>  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); | 
