fix really bad breakage in strtol, etc.: failure to accept leading spaces
authorRich Felker <dalias@aerifal.cx>
Thu, 19 Apr 2012 16:47:34 +0000 (12:47 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 19 Apr 2012 16:47:34 +0000 (12:47 -0400)
src/internal/floatscan.c
src/internal/floatscan.h
src/internal/intscan.c
src/stdio/vfscanf.c
src/stdlib/strtod.c

index 3217543..7381e9a 100644 (file)
@@ -394,12 +394,13 @@ static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
        return scalbnl(y, e2);
 }
 
        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 sign = 1;
        int i;
        int bits;
        int emin;
+       int c;
 
        switch (prec) {
        case 0:
 
        switch (prec) {
        case 0:
@@ -418,7 +419,7 @@ long double __floatscan(FILE *f, int c, int prec, int pok)
                return 0;
        }
 
                return 0;
        }
 
-       if (c<0) c = shgetc(f);
+       while (isspace((c=shgetc(f))));
 
        if (c=='+' || c=='-') {
                sign -= 2*(c=='-');
 
        if (c=='+' || c=='-') {
                sign -= 2*(c=='-');
index 5595b81..e027fa0 100644 (file)
@@ -3,6 +3,6 @@
 
 #include <stdio.h>
 
 
 #include <stdio.h>
 
-long double __floatscan(FILE *, int, int, int);
+long double __floatscan(FILE *, int, int);
 
 #endif
 
 #endif
index d65fc45..178cdf0 100644 (file)
@@ -32,7 +32,7 @@ unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long
                errno = EINVAL;
                return 0;
        }
                errno = EINVAL;
                return 0;
        }
-       c = shgetc(f);
+       while (isspace((c=shgetc(f))));
        if (c=='+' || c=='-') {
                neg = -(c=='-');
                c = shgetc(f);
        if (c=='+' || c=='-') {
                neg = -(c=='-');
                c = shgetc(f);
index 73294cd..64fa975 100644 (file)
@@ -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':
                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:
                        if (!shcnt(f)) goto match_fail;
                        if (dest) switch (size) {
                        case SIZE_def:
index ecfabdf..1886efa 100644 (file)
@@ -5,16 +5,14 @@
 
 static long double strtox(const char *s, char **p, int prec)
 {
 
 static long double strtox(const char *s, char **p, int prec)
 {
-       char *t = (char *)s;
-       while (isspace(*t)) t++;
        FILE f = {
        FILE f = {
-               .buf = (void *)t, .rpos = (void *)t,
+               .buf = (void *)s, .rpos = (void *)s,
                .rend = (void *)-1, .lock = -1
        };
        shlim(&f, 0);
                .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);
        off_t cnt = shcnt(&f);
-       if (p) *p = cnt ? t + cnt : (char *)s;
+       if (p) *p = cnt ? (char *)s + cnt : (char *)s;
        return y;
 }
 
        return y;
 }