aboutsummaryrefslogtreecommitdiff
path: root/stdlib/strtod_l.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-01-11 17:28:58 +0000
committerUlrich Drepper <drepper@redhat.com>2007-01-11 17:28:58 +0000
commit43b9d657408fbf47a47934f9e7c84ed87f7f5a18 (patch)
treed819c8eaa1541afbf358c47e6c8ce15855f21e17 /stdlib/strtod_l.c
parent66193697e06231f48dd36d78b68190aaa864cb63 (diff)
downloadglibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.zip
glibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.tar.gz
glibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.tar.bz2
[BZ #3855]
* stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by hexadecimal digit should accept just the initial 0. * stdlib/tst-strtod2.c (tests): New variable. (do_test): Run several tests rather than just one. 2007-01-11 Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'stdlib/strtod_l.c')
-rw-r--r--stdlib/strtod_l.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index b4e4819..397fd70 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -1,5 +1,6 @@
/* Convert string representing a number to float value, using given locale.
- Copyright (C) 1997,1998,2002,2004,2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 1997,1998,2002,2004,2005,2006,2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -665,14 +666,23 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
if (!((c >= L_('0') && c <= L_('9'))
|| (base == 16 && ((CHAR_TYPE) TOLOWER (c) >= L_('a')
&& (CHAR_TYPE) TOLOWER (c) <= L_('f')))
+ || (
#ifdef USE_WIDE_CHAR
- || c == (wint_t) decimal
+ c == (wint_t) decimal
#else
- || ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
- if (decimal[cnt] != cp[cnt])
- break;
- decimal[cnt] == '\0'; })
+ ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
+ if (decimal[cnt] != cp[cnt])
+ break;
+ decimal[cnt] == '\0'; })
#endif
+ /* '0x.' alone is not a valid hexadecimal number.
+ '.' alone is not valid either, but that has been checked
+ already earlier. */
+ && (base != 16
+ || cp != start_of_digits
+ || (cp[decimal_len] >= L_('0') && cp[decimal_len] <= L_('9'))
+ || ((CHAR_TYPE) TOLOWER (cp[decimal_len]) >= L_('a')
+ && (CHAR_TYPE) TOLOWER (cp[decimal_len]) <= L_('f'))))
|| (base == 16 && (cp != start_of_digits
&& (CHAR_TYPE) TOLOWER (c) == L_('p')))
|| (base != 16 && (CHAR_TYPE) TOLOWER (c) == L_('e'))))