fix incorrect range checks in wcsrtombs
authorRich Felker <dalias@aerifal.cx>
Thu, 4 Apr 2013 18:48:48 +0000 (14:48 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 4 Apr 2013 18:48:48 +0000 (14:48 -0400)
negative values of wchar_t need to be treated in the non-ASCII case so
that they can properly generate EILSEQ rather than getting truncated
to 8bit values and stored in the output.

src/multibyte/wcsrtombs.c

index 2582ac2..d48a65e 100644 (file)
@@ -18,7 +18,7 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
        size_t N = n, l;
        if (!s) {
                for (n=0, ws2=*ws; *ws2; ws2++) {
        size_t N = n, l;
        if (!s) {
                for (n=0, ws2=*ws; *ws2; ws2++) {
-                       if (*ws2 >= 0x80) {
+                       if (*ws2 >= 0x80u) {
                                l = wcrtomb(buf, *ws2, 0);
                                if (!(l+1)) return -1;
                                n += l;
                                l = wcrtomb(buf, *ws2, 0);
                                if (!(l+1)) return -1;
                                n += l;
@@ -27,7 +27,7 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
                return n;
        }
        while (n>=4 && **ws) {
                return n;
        }
        while (n>=4 && **ws) {
-               if (**ws >= 0x80) {
+               if (**ws >= 0x80u) {
                        l = wcrtomb(s, **ws, 0);
                        if (!(l+1)) return -1;
                        s += l;
                        l = wcrtomb(s, **ws, 0);
                        if (!(l+1)) return -1;
                        s += l;
@@ -39,7 +39,7 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
                (*ws)++;
        }
        while (n && **ws) {
                (*ws)++;
        }
        while (n && **ws) {
-               if (**ws >= 0x80) {
+               if (**ws >= 0x80u) {
                        l = wcrtomb(buf, **ws, 0);
                        if (!(l+1)) return -1;
                        if (l>n) return N-n;
                        l = wcrtomb(buf, **ws, 0);
                        if (!(l+1)) return -1;
                        if (l>n) return N-n;