summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Vrany <jan.vrany@labware.com>2022-12-12 22:13:27 +0000
committerJan Vrany <jan.vrany@labware.com>2022-12-12 22:13:27 +0000
commit361e5e947e5193838919afe59ec3961d4dde40ea (patch)
treefce9c2945e509caf524abb68687b4b75ffd16220
parentb99ceddc917ab623cfe663c3aab5cc45e3b98b57 (diff)
downloadbinutils-gdb-users/jv/try-fix-use-after-free-fixup-v01.tar.gz
gdb: fix command lookup in execute_command ()users/jv/try-fix-use-after-free-fixup-v01
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 ().
-rw-r--r--gdb/top.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/gdb/top.c b/gdb/top.c
index 742997808bd..caa08d98cec 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -655,11 +655,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);
@@ -702,7 +697,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);