Check for NULL character before calling strchr.
authorAndrew Burgess <aburgess@broadcom.com>
Tue, 16 Jul 2013 21:12:14 +0000 (21:12 +0000)
committerAndrew Burgess <aburgess@broadcom.com>
Tue, 16 Jul 2013 21:12:14 +0000 (21:12 +0000)
  http://sourceware.org/ml/gdb-patches/2013-07/msg00322.html

gdb/ChangeLog

        * common/format.c (parse_format_string): Add checks for NULL
        character before calling strchr.

gdb/testsuite/ChangeLog

        * gdb.base/printcmds.exp (test_printf): Add tests for format
        strings with missing format specifier.

gdb/ChangeLog
gdb/common/format.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/printcmds.exp

index 67ce94b..a0f22da 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-16  Andrew Burgess  <aburgess@broadcom.com>
+
+       * common/format.c (parse_format_string): Add checks for NULL
+       character before calling strchr.
+
 2013-07-16  Doug Evans  <dje@google.com>
 
        * solist.h (target_so_ops.find_and_open_solib): Clarify usage of
index 5803818..1bdd253 100644 (file)
@@ -156,7 +156,7 @@ parse_format_string (const char **arg)
 
        /* The first part of a format specifier is a set of flag
           characters.  */
-       while (strchr ("0-+ #", *f))
+       while (*f != '\0' && strchr ("0-+ #", *f))
          {
            if (*f == '#')
              seen_hash = 1;
@@ -170,7 +170,7 @@ parse_format_string (const char **arg)
          }
 
        /* The next part of a format specifier is a width.  */
-       while (strchr ("0123456789", *f))
+       while (*f != '\0' && strchr ("0123456789", *f))
          f++;
 
        /* The next part of a format specifier is a precision.  */
@@ -178,7 +178,7 @@ parse_format_string (const char **arg)
          {
            seen_prec = 1;
            f++;
-           while (strchr ("0123456789", *f))
+           while (*f != '\0' && strchr ("0123456789", *f))
              f++;
          }
 
index 885f405..ddd00ea 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-16  Andrew Burgess  <aburgess@broadcom.com>
+
+       * gdb.base/printcmds.exp (test_printf): Add tests for format
+       strings with missing format specifier.
+
 2013-07-16  Tom Tromey  <tromey@redhat.com>
 
        * gdb.ada/info_types.exp: Use standard_testfile.
index 0597ab0..0c06557 100644 (file)
@@ -718,6 +718,12 @@ proc test_printf {} {
     # Regression test for "%% at end of format string.
     # See http://sourceware.org/bugzilla/show_bug.cgi?id=11345
     gdb_test "printf \"%%%d%%\\n\", 5" "%5%"
+
+    # Some tests for missing format specifier after '%'.
+    gdb_test "printf \"%\", 0" "Incomplete format specifier at end of format string"
+    gdb_test "printf \"%.234\", 0" "Incomplete format specifier at end of format string"
+    gdb_test "printf \"%-\", 0" "Incomplete format specifier at end of format string"
+    gdb_test "printf \"%-23\", 0" "Incomplete format specifier at end of format string"
 }
 
 #Test printing DFP values with printf