summaryrefslogtreecommitdiffhomepage
path: root/init
diff options
context:
space:
mode:
Diffstat (limited to 'init')
-rw-r--r--init/init.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/init/init.c b/init/init.c
index 0a0d503b5..a2cc3b5f5 100644
--- a/init/init.c
+++ b/init/init.c
@@ -401,20 +401,22 @@ static void init_exec(const char *command)
char buf[COMMAND_SIZE + 6]; /* COMMAND_SIZE+strlen("exec ")+1 */
int dash = (command[0] == '-' /* maybe? && command[1] == '/' */);
+ command += dash;
+
/* See if any special /bin/sh requiring characters are present */
if (strpbrk(command, "~`!$^&*()=|\\{}[];\"'<>?") != NULL) {
- strcpy(buf, "exec ");
- strcpy(buf + 5, command + dash); /* excluding "-" */
+ sprintf(buf, "exec %s", command); /* excluding "-" */
/* NB: LIBBB_DEFAULT_LOGIN_SHELL define has leading dash */
cmd[0] = (char*)(LIBBB_DEFAULT_LOGIN_SHELL + !dash);
cmd[1] = (char*)"-c";
cmd[2] = buf;
cmd[3] = NULL;
+ command = LIBBB_DEFAULT_LOGIN_SHELL + 1;
} else {
/* Convert command (char*) into cmd (char**, one word per string) */
char *word, *next;
int i = 0;
- next = strcpy(buf, command); /* including "-" */
+ next = strcpy(buf, command - dash); /* command including "-" */
while ((word = strsep(&next, " \t")) != NULL) {
if (*word != '\0') { /* not two spaces/tabs together? */
cmd[i] = word;
@@ -425,14 +427,14 @@ static void init_exec(const char *command)
}
/* If we saw leading "-", it is interactive shell.
* Try harder to give it a controlling tty.
- * And skip "-" in actual exec call. */
- if (dash) {
+ */
+ if (ENABLE_FEATURE_INIT_SCTTY && dash) {
/* _Attempt_ to make stdin a controlling tty. */
- if (ENABLE_FEATURE_INIT_SCTTY)
- ioctl(STDIN_FILENO, TIOCSCTTY, 0 /*only try, don't steal*/);
+ ioctl(STDIN_FILENO, TIOCSCTTY, 0 /*only try, don't steal*/);
}
- BB_EXECVP(cmd[0] + dash, cmd);
- message(L_LOG | L_CONSOLE, "can't run '%s': %s", cmd[0], strerror(errno));
+ /* Here command never contains the dash, cmd[0] might */
+ BB_EXECVP(command, cmd);
+ message(L_LOG | L_CONSOLE, "can't run '%s': %s", command, strerror(errno));
/* returns if execvp fails */
}