1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

stdio-common: Also reject exp char w/o significand in i18n scanf [BZ #13988]

Fix the handling of real 'scanf' input such as "+.e" as per BZ #13988
for the i18n case as well, complementing commit 6ecec3b616 ("Don't
accept exp char without preceding digits in scanf float parsing"), where
the 'e' character is incorrectly consumed from input.  Add a test case
matching stdio-common/bug26.c, with bits from localedata/tst-sscanf.c.

Reviewed-by: Joseph Myers <josmyers@redhat.com>
This commit is contained in:
Maciej W. Rozycki
2025-03-28 12:35:53 +00:00
parent 47076b3163
commit a26638424f
3 changed files with 63 additions and 3 deletions

View File

@@ -2409,7 +2409,7 @@ digits_extended_fail:
if (got_e && charbuf.current[-1] == exp_char
&& (c == L_('-') || c == L_('+')))
char_buffer_add (&charbuf, c);
else if (char_buffer_size (&charbuf) > got_sign && !got_e
else if (got_digit && !got_e
&& (CHAR_T) TOLOWER (c) == exp_char)
{
char_buffer_add (&charbuf, exp_char);
@@ -2426,7 +2426,10 @@ digits_extended_fail:
if (c == wcdigits[n])
{
if (n < 10)
char_buffer_add (&charbuf, L_('0') + n);
{
char_buffer_add (&charbuf, L_('0') + n);
got_digit = 1;
}
else if (n == 11 && !got_dot)
{
char_buffer_add (&charbuf, decimal);
@@ -2461,7 +2464,10 @@ digits_extended_fail:
width = avail;
if (n < 10)
char_buffer_add (&charbuf, L_('0') + n);
{
char_buffer_add (&charbuf, L_('0') + n);
got_digit = 1;
}
else if (n == 11 && !got_dot)
{
/* Add all the characters. */