diff options
| author | Rich Felker <dalias@aerifal.cx> | 2012-04-19 12:47:34 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2012-04-19 12:47:34 -0400 | 
| commit | cb81b6947c0277a6a27ddc699d716e9cf2b524aa (patch) | |
| tree | 50c78b49bb6d81a726b1d58026757e7d1185a9ac | |
| parent | 769d3d349824fb45218972a1cf0e912cfee62d51 (diff) | |
| download | musl-cb81b6947c0277a6a27ddc699d716e9cf2b524aa.tar.gz | |
fix really bad breakage in strtol, etc.: failure to accept leading spaces
| -rw-r--r-- | src/internal/floatscan.c | 5 | ||||
| -rw-r--r-- | src/internal/floatscan.h | 2 | ||||
| -rw-r--r-- | src/internal/intscan.c | 2 | ||||
| -rw-r--r-- | src/stdio/vfscanf.c | 2 | ||||
| -rw-r--r-- | 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 <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;  } | 
