This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] allow nested sourced commands
- From: Andrew STUBBS <andrew dot stubbs at st dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Date: Tue, 04 Apr 2006 11:31:58 +0100
- Subject: Re: [PATCH] allow nested sourced commands
- References: <442BD6F1.8070804@st.com> <44324959.4@st.com>
Sorry, I forgot to attach the patch.
Andrew Stubbs wrote:
Andrew Stubbs wrote:
I have discovered a problem in the GDB command line reading code.
command_line_input() uses a static buffer to hold the current command.
This means that it is not properly re-entrant - commands that contain
other commands, such as user defined commands, are not handled safely.
See http://sources.redhat.com/ml/gdb-patches/2006-03/msg00356.html
The attached patch should fix the problem.
I tried to fix the problem in command_line_input, but there were too
many ways for the string to leak, so I have opted for the simpler fix,
even though it feels like treating the symptoms, not the problem.
Anyway, with this patch it no longer attempts to read data that has been
overwritten, so everything works fine. Valgrind reports no problems with
the test case I posted before.
Andrew Stubbs
2006-04-04 Andrew Stubbs <andrew.stubbs@st.com>
* cli/cli-script.c (struct user_args): Add command field.
(arg_cleanup): Free command string.
(setup_user_args): Copy the command line before relying on it.
Index: src/gdb/cli/cli-script.c
===================================================================
--- src.orig/gdb/cli/cli-script.c 2006-04-04 10:53:26.000000000 +0100
+++ src/gdb/cli/cli-script.c 2006-04-04 11:09:33.000000000 +0100
@@ -54,6 +54,7 @@ static int control_level;
struct user_args
{
struct user_args *next;
+ char *command;
struct
{
char *arg;
@@ -483,6 +484,7 @@ arg_cleanup (void *ignore)
_("arg_cleanup called with no user args.\n"));
user_args = user_args->next;
+ xfree (oargs->command);
xfree (oargs);
}
@@ -507,6 +509,8 @@ setup_user_args (char *p)
if (p == NULL)
return old_chain;
+ user_args->command = p = xstrdup (p);
+
while (*p)
{
char *start_arg;