about summary refs log tree commit diff
path: root/src/stdlib
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-04-16 17:17:05 -0400
committerRich Felker <dalias@aerifal.cx>2012-04-16 17:17:05 -0400
commita4310aa2f592779118912fe5e7f6df4fd6b6d64a (patch)
treecd7e2961c3f1a22656890e6b4f011234ce0cd5aa /src/stdlib
parent96e9773eb764afa649b099a6e283dba4c69389a9 (diff)
downloadmusl-a4310aa2f592779118912fe5e7f6df4fd6b6d64a.tar.gz
musl-a4310aa2f592779118912fe5e7f6df4fd6b6d64a.tar.xz
musl-a4310aa2f592779118912fe5e7f6df4fd6b6d64a.zip
avoid hitting eof in wcstol
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.
Diffstat (limited to 'src/stdlib')
-rw-r--r--src/stdlib/wcstol.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/stdlib/wcstol.c b/src/stdlib/wcstol.c
index cbdd8067..822bcf1a 100644
--- a/src/stdlib/wcstol.c
+++ b/src/stdlib/wcstol.c
@@ -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;