From 37e5833da583310268dc1b04fc6839e81b987897 Mon Sep 17 00:00:00 2001 From: Jan Vrany Date: Mon, 19 Dec 2022 11:24:36 +0000 Subject: [PATCH] gdb: fix command lookup in execute_command () 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 --- gdb/top.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/gdb/top.c b/gdb/top.c index 45e65beb3b3..b732f29653f 100644 --- 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); -- 2.30.2