aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Kingdon <jkingdon@engr.sgi.com>1993-06-22 04:27:00 +0000
committerJim Kingdon <jkingdon@engr.sgi.com>1993-06-22 04:27:00 +0000
commit3768398df869ae68cede4a9913cdae34a71782a0 (patch)
tree5297fa6588f364592ba1f365ebb3adb07605fbdc
parent304b747aada43ce6ed4e3098b6ec2ab3495df270 (diff)
downloadfsf-binutils-gdb-3768398df869ae68cede4a9913cdae34a71782a0.zip
fsf-binutils-gdb-3768398df869ae68cede4a9913cdae34a71782a0.tar.gz
fsf-binutils-gdb-3768398df869ae68cede4a9913cdae34a71782a0.tar.bz2
* fork-child.c (fork_inferior): Quote exec_file so it can contain
funky characters.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/fork-child.c25
2 files changed, 27 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9179c38..d3c16b2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jun 21 16:09:46 1993 Jim Kingdon (kingdon@cygnus.com)
+
+ * fork-child.c (fork_inferior): Quote exec_file so it can contain
+ funky characters.
+
Mon Jun 21 16:56:47 1993 Fred Fish (fnf@cygnus.com)
* Makefile.in (INCLUDE_CFLAGS): Add BFD_INCLUDES for now, since
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 1ec7e7a..613f1ee 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -80,8 +80,11 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun)
shell_file = getenv ("SHELL");
if (shell_file == NULL)
shell_file = default_shell_file;
-
- len = 5 + strlen (exec_file) + 1 + strlen (allargs) + 1 + /*slop*/ 10;
+
+ /* Multiplying the length of exec_file by 4 is to account for the fact
+ that it may expand when quoted; it is a worst-case number based on
+ every character being '. */
+ len = 5 + 4 * strlen (exec_file) + 1 + strlen (allargs) + 1 + /*slop*/ 12;
/* If desired, concat something onto the front of ALLARGS.
SHELL_COMMAND is the result. */
#ifdef SHELL_COMMAND_CONCAT
@@ -92,7 +95,23 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun)
shell_command[0] = '\0';
#endif
strcat (shell_command, "exec ");
- strcat (shell_command, exec_file);
+
+ /* Now add exec_file, quoting as necessary. Quoting in this style is
+ said to work with all shells. */
+ {
+ char *p;
+
+ strcat (shell_command, "'");
+ for (p = exec_file; *p != '\0'; ++p)
+ {
+ if (*p == '\'')
+ strcat (shell_command, "'\\''");
+ else
+ strncat (shell_command, p, 1);
+ }
+ strcat (shell_command, "'");
+ }
+
strcat (shell_command, " ");
strcat (shell_command, allargs);