gdb: fix command lookup in execute_command ()
authorJan Vrany <jan.vrany@labware.com>
Mon, 19 Dec 2022 11:24:36 +0000 (11:24 +0000)
committerJan Vrany <jan.vrany@labware.com>
Mon, 19 Dec 2022 11:24:36 +0000 (11:24 +0000)
Commit b5661ff2 ("gdb: fix possible use-after-free when
executing commands") used lookup_cmd_exact () to lookup
command again after its execution to avoid possible
use-after-free error.

However this change broke test gdb.base/define.exp which
defines a post-hook for subcommand ("target testsuite").
In this case,  lookup_cmd_exact () returned NULL because
there's no command 'testsuite' in top-level commands.

This commit fixes this case by looking up the command again
using the original command line via lookup_cmd ().

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/top.c

index 45e65beb3b398d6bca676bfdf8c4a96fe5154877..b732f29653f01cb9ec3dfd1f852694c8aafc1b44 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -651,11 +651,6 @@ execute_command (const char *p, int from_tty)
            }
        }
 
-      /* Remember name of the command.  This is needed later when
-        executing command post-hooks to handle the case when command
-        is redefined or removed during it's execution.  See below.  */
-      std::string c_name (c->name);
-
       /* If this command has been pre-hooked, run the hook first.  */
       execute_cmd_pre_hook (c);
 
@@ -698,7 +693,8 @@ execute_command (const char *p, int from_tty)
         We need to lookup the command again since during its execution,
         a command may redefine itself.  In this case, C pointer
         becomes invalid so we need to look it up again.  */
-      c = lookup_cmd_exact (c_name.c_str (), cmdlist);
+      const char *cmd2 = cmd_start;
+      c = lookup_cmd (&cmd2, cmdlist, "", nullptr, 1, 1);
       if (c != nullptr)
        execute_cmd_post_hook (c);