prevent CNAME/PTR parsing from reading data past the response end
[musl] / src / stdlib / wcstod.c
index 338c616..0deb701 100644 (file)
@@ -1,6 +1,8 @@
 #include "shgetc.h"
 #include "floatscan.h"
 #include "stdio_impl.h"
+#include <wchar.h>
+#include <wctype.h>
 
 /* This read function heavily cheats. It knows:
  *  (1) len will always be 1
@@ -31,31 +33,32 @@ static long double wcstox(const wchar_t *s, wchar_t **p, int prec)
        unsigned char buf[64];
        FILE f = {0};
        f.flags = 0;
-       f.rpos = f.rend = 0;
-       f.buf = buf + 4;
+       f.rpos = f.rend = f.buf = buf + 4;
        f.buf_size = sizeof buf - 4;
        f.lock = -1;
        f.read = do_read;
        while (iswspace(*t)) t++;
        f.cookie = (void *)t;
        shlim(&f, 0);
-       long double y = __floatscan(&f, -1, prec, 1);
-       off_t cnt = shcnt(&f);
-       if (p) *p = cnt ? t + cnt : (wchar_t *)s;
+       long double y = __floatscan(&f, prec, 1);
+       if (p) {
+               size_t cnt = shcnt(&f);
+               *p = cnt ? t + cnt : (wchar_t *)s;
+       }
        return y;
 }
 
-float wcstof(const wchar_t *s, wchar_t **p)
+float wcstof(const wchar_t *restrict s, wchar_t **restrict p)
 {
        return wcstox(s, p, 0);
 }
 
-double wcstod(const wchar_t *s, wchar_t **p)
+double wcstod(const wchar_t *restrict s, wchar_t **restrict p)
 {
        return wcstox(s, p, 1);
 }
 
-long double wcstold(const wchar_t *s, wchar_t **p)
+long double wcstold(const wchar_t *restrict s, wchar_t **restrict p)
 {
        return wcstox(s, p, 2);
 }