fix rejection of dns responses with pointers past 512 byte offset
[musl] / src / multibyte / wcsrtombs.c
index d48a65e..b5713ae 100644 (file)
@@ -1,15 +1,4 @@
-/* 
- * This code was written by Rich Felker in 2010; no copyright is claimed.
- * This code is in the public domain. Attribution is appreciated but
- * unnecessary.
- */
-
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st)
 {
@@ -26,8 +15,13 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
                }
                return n;
        }
-       while (n>=4 && **ws) {
-               if (**ws >= 0x80u) {
+       while (n>=4) {
+               if (**ws-1u >= 0x7fu) {
+                       if (!**ws) {
+                               *s = 0;
+                               *ws = 0;
+                               return N-n;
+                       }
                        l = wcrtomb(s, **ws, 0);
                        if (!(l+1)) return -1;
                        s += l;
@@ -38,8 +32,13 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
                }
                (*ws)++;
        }
-       while (n && **ws) {
-               if (**ws >= 0x80u) {
+       while (n) {
+               if (**ws-1u >= 0x7fu) {
+                       if (!**ws) {
+                               *s = 0;
+                               *ws = 0;
+                               return N-n;
+                       }
                        l = wcrtomb(buf, **ws, 0);
                        if (!(l+1)) return -1;
                        if (l>n) return N-n;
@@ -52,7 +51,5 @@ size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstat
                }
                (*ws)++;
        }
-       if (n) *s = 0;
-       *ws = 0;
-       return N-n;
+       return N;
 }