summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eval.c3
-rw-r--r--src/exec.c21
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;
 	}
 }