projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
769d3d3
)
fix really bad breakage in strtol, etc.: failure to accept leading spaces
author
Rich Felker
<dalias@aerifal.cx>
Thu, 19 Apr 2012 16:47:34 +0000
(12:47 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Thu, 19 Apr 2012 16:47:34 +0000
(12:47 -0400)
src/internal/floatscan.c
patch
|
blob
|
history
src/internal/floatscan.h
patch
|
blob
|
history
src/internal/intscan.c
patch
|
blob
|
history
src/stdio/vfscanf.c
patch
|
blob
|
history
src/stdlib/strtod.c
patch
|
blob
|
history
diff --git
a/src/internal/floatscan.c
b/src/internal/floatscan.c
index
3217543
..
7381e9a
100644
(file)
--- 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);
}
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=='-');
diff --git
a/src/internal/floatscan.h
b/src/internal/floatscan.h
index
5595b81
..
e027fa0
100644
(file)
--- a/
src/internal/floatscan.h
+++ b/
src/internal/floatscan.h
@@
-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
diff --git
a/src/internal/intscan.c
b/src/internal/intscan.c
index
d65fc45
..
178cdf0
100644
(file)
--- 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;
}
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);
diff --git
a/src/stdio/vfscanf.c
b/src/stdio/vfscanf.c
index
73294cd
..
64fa975
100644
(file)
--- 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':
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:
diff --git
a/src/stdlib/strtod.c
b/src/stdlib/strtod.c
index
ecfabdf
..
1886efa
100644
(file)
--- 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)
{
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;
}