fix popen not to leak pipes from one child to another
[musl] / src / stdio / fgetws.c
index 2e76b56..b08b304 100644 (file)
@@ -1,8 +1,10 @@
 #include "stdio_impl.h"
+#include <wchar.h>
+#include <errno.h>
 
 wint_t __fgetwc_unlocked(FILE *);
 
-wchar_t *fgetws(wchar_t *s, int n, FILE *f)
+wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
 {
        wchar_t *p = s;
 
@@ -10,6 +12,10 @@ wchar_t *fgetws(wchar_t *s, int n, FILE *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;
@@ -17,7 +23,7 @@ wchar_t *fgetws(wchar_t *s, int n, FILE *f)
                if (c == '\n') break;
        }
        *p = 0;
-       if (ferror(f)) p = s;
+       if (ferror(f) || errno==EILSEQ) p = s;
 
        FUNLOCK(f);