From cb81b6947c0277a6a27ddc699d716e9cf2b524aa Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 19 Apr 2012 12:47:34 -0400 Subject: [PATCH] fix really bad breakage in strtol, etc.: failure to accept leading spaces --- src/internal/floatscan.c | 5 +++-- src/internal/floatscan.h | 2 +- src/internal/intscan.c | 2 +- src/stdio/vfscanf.c | 2 +- src/stdlib/strtod.c | 8 +++----- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index 32175431..7381e9a4 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -394,12 +394,13 @@ static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok) return scalbnl(y, e2); } -long double __floatscan(FILE *f, int c, int prec, int pok) +long double __floatscan(FILE *f, int prec, int pok) { int sign = 1; int i; int bits; int emin; + int c; switch (prec) { case 0: @@ -418,7 +419,7 @@ long double __floatscan(FILE *f, int c, int prec, int pok) return 0; } - if (c<0) c = shgetc(f); + while (isspace((c=shgetc(f)))); if (c=='+' || c=='-') { sign -= 2*(c=='-'); diff --git a/src/internal/floatscan.h b/src/internal/floatscan.h index 5595b81e..e027fa08 100644 --- a/src/internal/floatscan.h +++ b/src/internal/floatscan.h @@ -3,6 +3,6 @@ #include -long double __floatscan(FILE *, int, int, int); +long double __floatscan(FILE *, int, int); #endif diff --git a/src/internal/intscan.c b/src/internal/intscan.c index d65fc45c..178cdf0d 100644 --- a/src/internal/intscan.c +++ b/src/internal/intscan.c @@ -32,7 +32,7 @@ unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long errno = EINVAL; return 0; } - c = shgetc(f); + while (isspace((c=shgetc(f)))); if (c=='+' || c=='-') { neg = -(c=='-'); c = shgetc(f); diff --git a/src/stdio/vfscanf.c b/src/stdio/vfscanf.c index 73294cdb..64fa9754 100644 --- a/src/stdio/vfscanf.c +++ b/src/stdio/vfscanf.c @@ -291,7 +291,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap) case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': - y = __floatscan(f, -1, size, 0); + y = __floatscan(f, size, 0); if (!shcnt(f)) goto match_fail; if (dest) switch (size) { case SIZE_def: diff --git a/src/stdlib/strtod.c b/src/stdlib/strtod.c index ecfabdf1..1886efa5 100644 --- a/src/stdlib/strtod.c +++ b/src/stdlib/strtod.c @@ -5,16 +5,14 @@ static long double strtox(const char *s, char **p, int prec) { - char *t = (char *)s; - while (isspace(*t)) t++; FILE f = { - .buf = (void *)t, .rpos = (void *)t, + .buf = (void *)s, .rpos = (void *)s, .rend = (void *)-1, .lock = -1 }; shlim(&f, 0); - long double y = __floatscan(&f, -1, prec, 1); + long double y = __floatscan(&f, prec, 1); off_t cnt = shcnt(&f); - if (p) *p = cnt ? t + cnt : (char *)s; + if (p) *p = cnt ? (char *)s + cnt : (char *)s; return y; } -- 2.20.1