summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-04-19 12:47:34 -0400
committerRich Felker <dalias@aerifal.cx>2012-04-19 12:47:34 -0400
commitcb81b6947c0277a6a27ddc699d716e9cf2b524aa (patch)
tree50c78b49bb6d81a726b1d58026757e7d1185a9ac
parent769d3d349824fb45218972a1cf0e912cfee62d51 (diff)
downloadmusl-cb81b6947c0277a6a27ddc699d716e9cf2b524aa.tar.gz
fix really bad breakage in strtol, etc.: failure to accept leading spaces
-rw-r--r--src/internal/floatscan.c5
-rw-r--r--src/internal/floatscan.h2
-rw-r--r--src/internal/intscan.c2
-rw-r--r--src/stdio/vfscanf.c2
-rw-r--r--src/stdlib/strtod.c8
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 <stdio.h>
-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;
}