gdb/testsuite: Avoid a buffer overrun in `gdb.base/maint.exp'
authorPedro Alves <palves@redhat.com>
Fri, 28 Oct 2016 11:03:18 +0000 (12:03 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 28 Oct 2016 14:52:27 +0000 (15:52 +0100)
Fixes:

 PASS: gdb.base/maint.exp: maint w/o args
 ERROR: internal buffer is full.
 UNRESOLVED: gdb.base/maint.exp: maint info line-table w/o a file name

The problem is just many symtabs and long line tables, enough to
overflow the expect buffer.  Fix this by matching input incrementally.

gdb/testsuite/ChangeLog:
2016-10-28  Pedro Alves  <palves@redhat.com>

* gdb.base/maint.exp <maint info line-table w/o a file name>: Use
gdb_test_multiple, tighten regexps and match symtabs and line
tables incrementally.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/maint.exp

index 31b82eb64d4f12396a162a5114c86c2b9c91028e..52038e3914dcb7faf82a79f919deee2b47dbdb68 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-28  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/maint.exp <maint info line-table w/o a file name>: Use
+       gdb_test_multiple, tighten regexps and match symtabs and line
+       tables incrementally.
+
 2016-10-28  Luis Machado  <lgustavo@codesourcery.com>
 
        * gdb.base/foll-exec.exp (do_exec_tests): Make test pattern more
index e66f56608813e801160a454cac970df7a5feeed1..b07b370663ae62adeb2b4b1a206561091805edd6 100644 (file)
@@ -474,9 +474,41 @@ gdb_test "maint" \
     "\"maintenance\" must be followed by the name of a maintenance command\\.\r\nList.*unambiguous\\..*" \
     "maint w/o args"
 
-gdb_test "maint info line-table" \
-    "symtab: \[^\n\r\]+${srcfile}.*\\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX.*LINE.*ADDRESS.*" \
-    "maint info line-table w/o a file name"
+# Test that "main info line-table" w/o a file name shows the symtab for
+# $srcfile.
+set saw_srcfile 0
+set test "maint info line-table w/o a file name"
+gdb_test_multiple "maint info line-table" $test {
+    -re "symtab: \[^\n\r\]+${srcfile} \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS" {
+       set saw_srcfile 1
+       exp_continue
+    }
+    -re "symtab: \[^\n\r\]+ \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS" {
+       # Match each symtab to avoid overflowing expect's buffer.
+       exp_continue
+    }
+    -re "$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" {
+       # Line table entries can be long too:
+       #
+       #  INDEX    LINE ADDRESS
+       #  0          29 0x00000000004006f6
+       #  1          30 0x00000000004006fa
+       #  2          31 0x0000000000400704
+       #  3          42 0x0000000000400706
+       #  4          43 0x0000000000400719
+       #  5          44 0x0000000000400722
+       #  6          45 0x0000000000400740
+       #  (...)
+       #  454       129 0x00007ffff7df1d28
+       #  455         0 0x00007ffff7df1d3f
+       #
+       # Match each line to avoid overflowing expect's buffer.
+       exp_continue
+    }
+    -re "$gdb_prompt $" {
+       gdb_assert $saw_srcfile $test
+    }
+}
 
 gdb_test "maint info line-table ${srcfile}" \
     "symtab: \[^\n\r\]+${srcfile}.*INDEX.*LINE.*ADDRESS.*" \