This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] allow nested sourced commands
- From: Michael Snyder <msnyder at redhat dot com>
- To: Andrew STUBBS <andrew dot stubbs at st dot com>
- Cc: GDB Patches <gdb-patches at sourceware dot org>
- Date: Tue, 04 Apr 2006 12:57:53 -0700
- Subject: Re: [PATCH] allow nested sourced commands
- References: <442BD6F1.8070804@st.com> <44324959.4@st.com> <44324B1E.3070409@st.com>
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
Well, it has the virtue of simplicity!
At first glance, it seems conceptually valid.
I think you need a clean-up, though. What if it errors?
------------------------------------------------------------------------
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;