avoid hitting eof in wcstol
authorRich Felker <dalias@aerifal.cx>
Mon, 16 Apr 2012 21:17:05 +0000 (17:17 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 16 Apr 2012 21:17:05 +0000 (17:17 -0400)
shunget cannot unget eof status, causing wcstol to leave endptr
pointing to the wrong place when scanning, for example, L"0x". cheap
fix is to make the read function provide an infinite stream of bogus
characters rather than eof. really this is something of a design flaw
in how the shgetc system is used for strto* and wcsto*; in the long
term, I believe multi-character unget should be scrapped and replaced
with a function that can subtract from the f->shcnt counter.

src/stdlib/wcstol.c

index cbdd8067d2fa861b1a01ede16642117f508db668..822bcf1a243795521a26a9a378746af0889ab0f7 100644 (file)
@@ -11,6 +11,7 @@ static size_t do_read(FILE *f, unsigned char *buf, size_t len)
        size_t i;
        const wchar_t *wcs = f->cookie;
 
+       if (!wcs[0]) wcs=L"@";
        for (i=0; i<f->buf_size && wcs[i]; i++)
                f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
        f->rpos = f->buf;
@@ -30,8 +31,8 @@ static unsigned long long wcstox(const wchar_t *s, wchar_t **p, int base, unsign
        FILE f = {0};
        f.flags = 0;
        f.rpos = f.rend = 0;
-       f.buf = buf;
-       f.buf_size = sizeof buf;
+       f.buf = buf + 4;
+       f.buf_size = sizeof buf - 4;
        f.lock = -1;
        f.read = do_read;
        f.cookie = (void *)s;