aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-10-28 12:03:18 +0100
committerPedro Alves <palves@redhat.com>2016-10-28 15:52:27 +0100
commitf610ab6d3cbab5d8b8ef3f3a93dd81a800ec5725 (patch)
tree1b55ebc21b3c3a8f9c256b76191ea39af14aefbf /gdb
parentb129b0cacd4c8e982605b7c8d99e96c74155882a (diff)
downloadgdb-f610ab6d3cbab5d8b8ef3f3a93dd81a800ec5725.zip
gdb-f610ab6d3cbab5d8b8ef3f3a93dd81a800ec5725.tar.gz
gdb-f610ab6d3cbab5d8b8ef3f3a93dd81a800ec5725.tar.bz2
gdb/testsuite: Avoid a buffer overrun in `gdb.base/maint.exp'
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.base/maint.exp38
2 files changed, 41 insertions, 3 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 31b82eb..52038e3 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index e66f566..b07b370 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -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.*" \