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] gdb output pipelining to shell


On Sat, Jul 16, 2011 at 3:17 PM, Eli Zaretskii <eliz@gnu.org> wrote:
>> Date: Sat, 16 Jul 2011 14:12:35 +0530
>> From: Abhijit Halder <abhijit.k.halder@gmail.com>
>>
>> I have implemented a feature which will allow one to pass the output
>> of any gdb command to the shell for further processing.
>
> Thanks.
>
> If this is accepted, we will need a corresponding addition to the
> manual.
>
>> + ? ? ?for (cpos = spos; (cpos = memchr (cpos, '"', (sh_cmd-cpos))) != NULL; cpos++)
>> + ? ? ? ?quote_cnt++;
>> + ? ? ?spos = (sh_cmd + 1);
>> + ? ? ?if ((quote_cnt % 2) == 0 || (sh_cmd = strchr (spos, '|')) == NULL)
>> + ? ? ? ?break;
>
> I'm not sure I understand this (comments would be helpful). ?Are you
> assuming that quote characters `"' in shell commands cannot be
> escaped, e.g. with a backslash? ?And what about quoting with a single
> quote character ("'")?
>
Any pipe ('|' character), not within double quote will be considered
as either a bitwise-OR operator or a pipe between gdb and shell.
String after pipe (not within double quote) will be considered as
shell command if (and only if) it is encapsulated within opening and
closing braces ('{' and '}') . The shell command can surely contain
double quote, even braces. There is no validation done for shell
command.

>> + ? ?if (*cpos != '{')
>> + ? ? ?return NULL;
>> +
>> + ? ?*cpos = ' ';
>> +
>> + ? ?cpos = epos;
>> + ? ?while (isspace(*cpos))
>> + ? ? ?cpos--;
>> +
>> + ? ?if (*cpos != '}')
>> + ? ? ?return NULL;
>
> What is this magic about {...} that you are removing? ?Again, comments
> could help.
>
Here I am removing the braces from the shell command. An example will
help in understanding this:
(gdb) thread apply all bt | { grep "foo" }
This will be a valid command. { grep "foo" } will be considered as
shell command and we need to erase the braces part of it to make it a
valid shell command.
>> +
>> + ? ?*cpos = ' ';
>> + ? ?}
>> +
>> + ?if (sh_cmd)
>> + ? ?*sh_cmd++ = '\0';
>> +
>> + ?return sh_cmd;
>
> This butchers the string passed to execute_command. ?Are you sure all
> the callers of execute_command can safely deal with that? ?What if the
> string is a constant string, for example?
>
The new code path will be executed only when one will enter a command
containing pipeline between gdb and shell. In that case the string
passed to execute_command must not be a constant string (since it is
user input from gdb prompt). Hence we are safe.


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