gdb: handle calls to edit command passing only a linespec condition
authorAndrew Burgess <aburgess@redhat.com>
Tue, 7 Dec 2021 22:26:05 +0000 (22:26 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Wed, 2 Feb 2022 16:27:36 +0000 (16:27 +0000)
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
gdb/testsuite/gdb.linespec/errors.exp

index 648005ffdfe680cdacd436b0e1882827fa34fd77..1d14b8e45270743cec04f7a0cad74dd2c2cb9026 100644 (file)
@@ -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<symtab_and_line> 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
index e258f6bb98c82429515293c5f66cb53108cb6529..c895e25da03ebe22b4edf9830d40df7103ffb173 100644 (file)
@@ -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\\."
+    }
+}