fix erroneous stop before input limit in mbsnrtowcs and wcsnrtombs
[musl] / src / multibyte / wcsnrtombs.c
index 640cbbe..676932b 100644 (file)
@@ -5,13 +5,14 @@ size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, s
        size_t l, cnt=0, n2;
        char *s, buf[256];
        const wchar_t *ws = *wcs;
+       const wchar_t *tmp_ws;
 
        if (!dst) s = buf, n = sizeof buf;
        else s = dst;
 
        while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) {
                if (n2>=n) n2=n;
-               wn -= n2;
+               tmp_ws = ws;
                l = wcsrtombs(s, &ws, n2, 0);
                if (!(l+1)) {
                        cnt = l;
@@ -22,6 +23,7 @@ size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, s
                        s += l;
                        n -= l;
                }
+               wn = ws ? wn - (ws - tmp_ws) : 0;
                cnt += l;
        }
        if (ws) while (n && wn) {