fix undefined behavior in wcsto[ld] family functions
authorRich Felker <dalias@aerifal.cx>
Fri, 24 Apr 2020 14:35:01 +0000 (10:35 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 24 Apr 2020 14:39:17 +0000 (10:39 -0400)
analogous to commit b287cd745c2243f8e5114331763a5a9813b5f6ee but for
the custom FILE stream type the wcstol and wcstod family use. __toread
could be used here as well, but there's a simple direct fix to make
the buffer pointers initially valid for subtraction, so just do that
to avoid pulling in stdio exit code in programs that don't use stdio.

src/stdlib/wcstod.c
src/stdlib/wcstol.c

index 26fe9af8b4cc7d7c5f69fbab349d1bb1735f18f8..0deb7010b1afa1f216b738b3ad128fbc3914ec1a 100644 (file)
@@ -33,8 +33,7 @@ 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;
index 4443f5772d90ee32d7aa29fda26b54a0520f938c..1eeb495fd6eaf2da6b44bae57bfcfd5512b1c838 100644 (file)
@@ -35,8 +35,7 @@ static unsigned long long wcstox(const wchar_t *s, wchar_t **p, int base, unsign
        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;