This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] allow nested sourced commands


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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]