From 82d0a72cdc9ca6cd37a8987e2bcd2eb707c51149 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Tue, 7 Dec 2021 22:26:05 +0000 Subject: [PATCH] gdb: handle calls to edit command passing only a linespec condition While working on the previous commit to fix PR cli/28665, I noticed that the 'edit' command would suffer from the same problem. That is, something like: (gdb) edit task 123 would cause GDB to break. For a full explanation of what's going on here, see the commit message for the previous commit. As with the previous commit, this issue can be prevented by detecting, and throwing, a junk at the end of the line error earlier, before calling decode_line_1. So, that's what this commit does. I've also added some tests for this issue. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28665 --- gdb/cli/cli-cmds.c | 7 ++++--- gdb/testsuite/gdb.linespec/errors.exp | 26 ++++++++++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 648005ffdfe..1d14b8e4527 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -968,6 +968,10 @@ edit_command (const char *arg, int from_tty) arg1 = arg; event_location_up location = string_to_event_location (&arg1, current_language); + + if (*arg1) + error (_("Junk at end of line specification.")); + std::vector sals = decode_line_1 (location.get (), DECODE_LINE_LIST_MODE, NULL, NULL, 0); @@ -987,9 +991,6 @@ edit_command (const char *arg, int from_tty) sal = sals[0]; - if (*arg1) - error (_("Junk at end of line specification.")); - /* If line was specified by address, first print exactly which line, and which file. In this case, sal.symtab == 0 means address is outside of all known source files, not that user diff --git a/gdb/testsuite/gdb.linespec/errors.exp b/gdb/testsuite/gdb.linespec/errors.exp index e258f6bb98c..c895e25da03 100644 --- a/gdb/testsuite/gdb.linespec/errors.exp +++ b/gdb/testsuite/gdb.linespec/errors.exp @@ -29,13 +29,19 @@ gdb_test "list fooc:/foo/bar/baz.c:1" "No source file named fooc." gdb_test "list fooc:/foo/bar/baz.c" "No source file named fooc." # PR cli/28665, gdb/28797 -gdb_test "list task 123" \ - "Junk at end of line specification\\." -gdb_test "list if (0)" \ - "Junk at end of line specification\\." -gdb_test "list thread 1" \ - "Junk at end of line specification\\." -gdb_test "list -force-condition" \ - "Junk at end of line specification\\." -gdb_test "list ,," \ - "Junk at end of line specification\\." +save_vars { env(EDITOR) } { + setenv EDITOR true + + foreach cmd {list edit} { + gdb_test "${cmd} task 123" \ + "Junk at end of line specification\\." + gdb_test "${cmd} if (0)" \ + "Junk at end of line specification\\." + gdb_test "${cmd} thread 1" \ + "Junk at end of line specification\\." + gdb_test "${cmd} -force-condition" \ + "Junk at end of line specification\\." + gdb_test "${cmd} ,," \ + "Junk at end of line specification\\." + } +}