Browse Source

fix really bad breakage in strtol, etc.: failure to accept leading spaces

Rich Felker 13 years ago
parent
commit
cb81b6947c
5 changed files with 9 additions and 10 deletions
  1. 3 2
      src/internal/floatscan.c
  2. 1 1
      src/internal/floatscan.h
  3. 1 1
      src/internal/intscan.c
  4. 1 1
      src/stdio/vfscanf.c
  5. 3 5
      src/stdlib/strtod.c

+ 3 - 2
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=='-');

+ 1 - 1
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

+ 1 - 1
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);

+ 1 - 1
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:

+ 3 - 5
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;
 }