aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2017-03-08 11:41:35 +0000
committerPedro Alves <palves@redhat.com>2017-03-08 11:41:35 +0000
commit6e5d74e74756fafe59e8198c4cc462cf7c57e12c (patch)
tree010e0817845a560794e50a2ad2f8eb12c7c1c62c /gdb/testsuite
parent5cf70512f835032c413f2554af07814e1dc05cd6 (diff)
downloadgdb-6e5d74e74756fafe59e8198c4cc462cf7c57e12c.zip
gdb-6e5d74e74756fafe59e8198c4cc462cf7c57e12c.tar.gz
gdb-6e5d74e74756fafe59e8198c4cc462cf7c57e12c.tar.bz2
Fix PR 21218: GDB dumps core when escaping newline in multi-line command
With commit 3b12939dfc2399 ("Replace the sync_execution global with a new enum prompt_state tristate"), GDB started aborting if you try splitting an input line with a continuation char (backslash) while in a multi-line command: (gdb) commands Type commands for breakpoint(s) 1, one per line. End with a line saying just "end". >print \ (gdb) 1 # note "(gdb)" incorrectly printed here. >end readline: readline_callback_read_char() called with no handler! $ That abort is actually a symptom of an old problem introduced when gdb_readline_wrapper was rewritten to use asynchronous readline, back in 2007. Note how the "(gdb)" prompt is printed above in the "(gdb) 1" line. Clearly it shouldn't be there, but it already was before the commit mentioned above. Fixing that also fixes the readline abort shown above. The problem starts when command_line_input passes a NULL prompt to gdb_readline_wrapper when it finds previous incomplete input due to a backslash, trying to fetch more input without printing another ">" secondary prompt. That itself should not be a problem, because passing NULL to gdb_readline_wrapper has the same meaning as passing a pointer to empty string, since gdb_readline_wrapper exposes the same interface as 'readline(char *)'. However, gdb_readline_wrapper passes the prompt argument directly to display_gdb_prompt, and for the latter, a NULL prompt argument has a different meaning - it requests printing the primary prompt. Before commit 782a7b8ef9c096 (which rewrote gdb_readline_wrapper to use asynchronous readline), GDB behaved like this: (gdb) commands [....] >print \ 1 >end (gdb) The above is what this commit restores GDB back to. New test included. gdb/ChangeLog: 2017-03-08 Pedro Alves <palves@redhat.com> PR cli/21218 * top.c (gdb_readline_wrapper): Avoid passing NULL to display_gdb_prompt. (command_line_input): Add comment. gdb/testsuite/ChangeLog: 2017-03-08 Pedro Alves <palves@redhat.com> Jan Kratochvil <jan.kratochvil@redhat.com> PR cli/21218 * gdb.base/commands.exp (backslash_in_multi_line_command_test): New proc. (top level): Call it.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.base/commands.exp29
2 files changed, 37 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 0654bef..d7b603b 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,4 +1,12 @@
2017-03-08 Pedro Alves <palves@redhat.com>
+ Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ PR cli/21218
+ * gdb.base/commands.exp (backslash_in_multi_line_command_test):
+ New proc.
+ (top level): Call it.
+
+2017-03-08 Pedro Alves <palves@redhat.com>
PR tui/21216
* gdb.tui/tui-nl-filtered-output.exp: New file.
diff --git a/gdb/testsuite/gdb.base/commands.exp b/gdb/testsuite/gdb.base/commands.exp
index 9ad70f5..6d3c398 100644
--- a/gdb/testsuite/gdb.base/commands.exp
+++ b/gdb/testsuite/gdb.base/commands.exp
@@ -1003,6 +1003,34 @@ proc_with_prefix redefine_backtrace_test {} {
gdb_test "bt" "hibob" "execute bt command"
}
+# Test an input line split with a continuation character (backslash)
+# while entering a multi-line command (in a secondary prompt).
+
+proc_with_prefix backslash_in_multi_line_command_test {} {
+ gdb_breakpoint "main"
+
+ gdb_test_multiple "commands" "commands" {
+ -re "End with a line saying just \"end\"\\.\r\n>$" {
+ pass "commands"
+ }
+ }
+
+ set test "input line split with backslash"
+ send_gdb "print \\\nargc\n"
+ gdb_test_multiple "" $test {
+ -re "^print \\\\\r\nargc\r\n>$" {
+ pass $test
+ }
+ }
+
+ gdb_test_no_output "end"
+
+ # Input any command, just to be sure the readline state is sane.
+ # In PR 21218, this would trigger the infamous:
+ # readline: readline_callback_read_char() called with no handler!
+ gdb_test "print 1" "" "run command"
+}
+
gdbvar_simple_if_test
gdbvar_simple_while_test
gdbvar_complex_if_while_test
@@ -1027,5 +1055,6 @@ recursive_source_test
if_commands_test
error_clears_commands_left
redefine_hook_test
+backslash_in_multi_line_command_test
# This one should come last, as it redefines "backtrace".
redefine_backtrace_test