]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix parsing of 0e+0 as float
authorAndreas Schwab <schwab@suse.de>
Thu, 31 Oct 2013 11:51:03 +0000 (12:51 +0100)
committerAndreas Schwab <schwab@suse.de>
Thu, 31 Oct 2013 11:51:03 +0000 (12:51 +0100)
ChangeLog
NEWS
stdio-common/tst-sscanf.c
stdio-common/vfscanf.c

index 56736937f1d2bc339654f9d056ca99a6f57e3f56..4b71c4a5f1f70f8693b2f652956529e95a540352 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-10-31  Andreas Schwab  <schwab@suse.de>
+
+       [BZ# 15917]
+       * stdio-common/vfscanf.c (_IO_vfwscanf): Handle leading '0' not
+       followed by 'x' as part of digit sequence.
+       * stdio-common/tst-sscanf.c (double_tests2): New tests.
+
 2013-10-31  Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
 
        [BZ #16037]
diff --git a/NEWS b/NEWS
index e3330fcf6b72d4b7a0758fc208a02bb1db59fe02..d24511981d6718c673e84fc78fcaac58c7703f52 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,8 +15,9 @@ Version 2.19
   15670, 15672, 15680, 15681, 15723, 15734, 15735, 15736, 15748, 15749,
   15754, 15760, 15764, 15797, 15799, 15825, 15844, 15847, 15849, 15855,
   15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893, 15895,
-  15897, 15905, 15909, 15919, 15921, 15923, 15939, 15948, 15963, 15966,
-  15988, 16032, 16034, 16036, 16037, 16041, 16071, 16072, 16074, 16078.
+  15897, 15905, 15909, 15917, 15919, 15921, 15923, 15939, 15948, 15963,
+  15966, 15988, 16032, 16034, 16036, 16037, 16041, 16071, 16072, 16074,
+  16078.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
index 1edb22719928fae97bcf7e1c52bcd1d491bef51a..3c34f58a635d5418830b2c49ecc1230360a9bed4 100644 (file)
@@ -109,6 +109,19 @@ struct test double_tests[] =
   { L("-inf"), L("%g"), 1 }
 };
 
+struct test2
+{
+  const CHAR *str;
+  const CHAR *fmt;
+  int retval;
+  char residual;
+} double_tests2[] =
+{
+  { L("0e+0"), L("%g%c"), 1, 0 },
+  { L("0xe+0"), L("%g%c"), 2, '+' },
+  { L("0x.e+0"), L("%g%c"), 2, '+' },
+};
+
 int
 main (void)
 {
@@ -196,5 +209,26 @@ main (void)
        }
     }
 
+  for (i = 0; i < sizeof (double_tests2) / sizeof (double_tests2[0]); ++i)
+    {
+      double dummy;
+      int ret;
+      char c = 0;
+
+      if ((ret = SSCANF (double_tests2[i].str, double_tests2[i].fmt,
+                        &dummy, &c)) != double_tests2[i].retval)
+       {
+         printf ("double_tests2[%d] returned %d != %d\n",
+                 i, ret, double_tests2[i].retval);
+         result = 1;
+       }
+      else if (ret == 2 && c != double_tests2[i].residual)
+       {
+         printf ("double_tests2[%d] stopped at '%c' != '%c'\n",
+                 i, c, double_tests2[i].residual);
+         result = 1;
+       }
+    }
+
   return result;
 }
index 78dc2fcfe54132be9718a2959ab8541cca501e7c..e6fa8f372bef327a7e582f03d7e64b142120cc04 100644 (file)
@@ -1966,6 +1966,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
                  if (width > 0)
                    --width;
                }
+             else
+               got_digit = 1;
            }
 
          while (1)