diff options
Diffstat (limited to '')
-rw-r--r-- | src/eval.c | 3 | ||||
-rw-r--r-- | src/exec.c | 21 |
2 files changed, 5 insertions, 19 deletions
diff --git a/src/eval.c b/src/eval.c index 2aa8317..1e0edd9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -727,7 +727,8 @@ evalcommand(union node *cmd, int flags) argc++; } - argv = nargv = stalloc(sizeof (char *) * (argc + 1)); + /* Reserve one extra spot at the front for shellexec. */ + argv = nargv = stalloc(sizeof (char *) * (argc + 2)) + 1; for (sp = arglist.list ; sp ; sp = sp->next) { TRACE(("evalcommand arg: %s\n", sp->text)); *nargv++ = sp->text; diff --git a/src/exec.c b/src/exec.c index 8a1f722..bbb70e8 100644 --- a/src/exec.c +++ b/src/exec.c @@ -149,11 +149,6 @@ shellexec(char **argv, const char *path, int idx) STATIC void tryexec(char *cmd, char **argv, char **envp) { - int repeated = 0; -#if !defined(BSD) && !defined(linux) - char *p; -#endif - repeat: #ifdef SYSV do { @@ -162,19 +157,9 @@ repeat: #else execve(cmd, argv, envp); #endif - if (repeated++) { - ckfree(argv); - } else if (errno == ENOEXEC) { - char **ap; - char **new; - - for (ap = argv; *ap; ap++) - ; - ap = new = ckmalloc((ap - argv + 2) * sizeof(char *)); - *ap++ = cmd = _PATH_BSHELL; - while ((*ap++ = *argv++)) - ; - argv = new; + if (cmd != _PATH_BSHELL && errno == ENOEXEC) { + *argv-- = cmd; + *argv = cmd = _PATH_BSHELL; goto repeat; } } |