libc: Fix parsing of hexadecimal numbers in strtol() family.
This had previously been partly fixed in 2571c7f720
.
MFC after: 1 week
Reviewed by: imp, allanjude, emaste
Differential Revision: https://reviews.freebsd.org/D41510
This commit is contained in:
parent
7ea28254ec
commit
b8b6bef43f
@ -83,7 +83,10 @@ _FUNCNAME(const char *nptr, char **endptr, int base)
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == '0' && (*s == 'x' || *s == 'X')) {
|
||||
c == '0' && (*s == 'x' || *s == 'X') &&
|
||||
((s[1] >= '0' && s[1] <= '9') ||
|
||||
(s[1] >= 'A' && s[1] <= 'F') ||
|
||||
(s[1] >= 'a' && s[1] <= 'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -79,7 +79,10 @@ _FUNCNAME(const char *nptr, char **endptr, int base)
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == '0' && (*s == 'x' || *s == 'X')) {
|
||||
c == '0' && (*s == 'x' || *s == 'X') &&
|
||||
((s[1] >= '0' && s[1] <= '9') ||
|
||||
(s[1] >= 'A' && s[1] <= 'F') ||
|
||||
(s[1] >= 'a' && s[1] <= 'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -78,7 +78,10 @@ wcstoimax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -63,7 +63,7 @@ wcstol_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int
|
||||
do {
|
||||
c = *s++;
|
||||
} while (iswspace_l(c, locale));
|
||||
if (c == '-') {
|
||||
if (c == L'-') {
|
||||
neg = 1;
|
||||
c = *s++;
|
||||
} else {
|
||||
@ -72,7 +72,10 @@ wcstol_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -78,7 +78,10 @@ wcstoll_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -72,7 +72,10 @@ wcstoul_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -78,7 +78,10 @@ wcstoull_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
@ -78,7 +78,10 @@ wcstoumax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
|
||||
c = *s++;
|
||||
}
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||
c == L'0' && (*s == L'x' || *s == L'X') &&
|
||||
((s[1] >= L'0' && s[1] <= L'9') ||
|
||||
(s[1] >= L'A' && s[1] <= L'F') ||
|
||||
(s[1] >= L'a' && s[1] <= L'f'))) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
|
Loading…
Reference in New Issue
Block a user