[PATCH 3/4] [PR gdbserver/25893]: Use construct_inferior_arguments which handles special chars

Michael Weghorn
2020-04-29T11:16:58Z

Use the construct_inferior_arguments function instead of
stringify_argv to construct a string from the program
arguments in those places where that one is then passed
to fork_inferior, since construct_inferior_arguments
properly takes care of special characters, while
stringify_argv does not.
Using construct_inferior_arguments seems "natural", since its
documentation also mentions that it "does the
same shell processing as fork_inferior".

This makes gdbserver properly handle program args containing special
characters, e.g. (example from PR25893)

$ gdbserver localhost:50505 myprogram "hello world"

now properly handles "hello world" as a single arg, not two separate
ones ("hello", "world").

I'm not sure regarding the two remaining uses of function stringify_argv
(in win32_process_target::create_inferior and
nto_process_target::create_inferior) whose result is not passed to
fork_inferior and don't know how the arg processing in the creation
of processes on those targets exactly works, so left them unchanged
for now.

2020-04-29 Michael Weghorn <m.weghorn@posteo.de>

PR gdbserver/25893
* linux-low.cc (linux_process_target::create_inferior),
lynx-low.cc (lynx_process_target::create_inferior): Use
construct_inferior_arguments instead of stringify_argv
to get string representation which properly escapes
special characters.
---
gdbserver/linux-low.cc | 2 +-
gdbserver/lynx-low.cc | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
index 3cd8d5594d..3f3ffc6c43 100644
--- a/gdbserver/linux-low.cc
+++ b/gdbserver/linux-low.cc
@@ -984,7 +984,7 @@ linux_process_target::create_inferior (const char *program,
{
maybe_disable_address_space_randomization restore_personality
(cs.disable_randomization);
- std::string str_program_args = stringify_argv (program_args);
+ std::string str_program_args = construct_inferior_arguments (program_args.size(), program_args.data());

pid = fork_inferior (program,
str_program_args.c_str (),
diff --git a/gdbserver/lynx-low.cc b/gdbserver/lynx-low.cc
index 9aa140c129..61f692f0c0 100644
--- a/gdbserver/lynx-low.cc
+++ b/gdbserver/lynx-low.cc
@@ -253,7 +253,7 @@ lynx_process_target::create_inferior (const char *program,
const std::vector<char *> &program_args)
{
int pid;
- std::string str_program_args = stringify_argv (program_args);
+ std::string str_program_args = construct_inferior_arguments (program_args.size(), program_args.data());;

lynx_debug ("create_inferior ()");

--
2.26.2