From d27f06b5f101469aa7c3a1d408d63d9dcc372ce3 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Tue, 8 Feb 2005 03:50:42 +0000 Subject: [PATCH] Alloc an extra slot in NewArgv. Removes the need to malloc an new vector if execve() fails. --- sudo.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sudo.c b/sudo.c index 089752dec..ea50d9baf 100644 --- a/sudo.c +++ b/sudo.c @@ -446,11 +446,10 @@ main(argc, argv, envp) * If we got here then execve() failed... */ if (errno == ENOEXEC) { - char **av = emalloc2(NewArgc + 2, sizeof(char *)); - av[0] = "sh"; - av[1] = safe_cmnd; - memcpy(av + 2, NewArgv + 1, NewArgc * sizeof(char *)); - execve(_PATH_BSHELL, av, new_environ); + NewArgv--; /* at least one extra slot... */ + NewArgv[0] = "sh"; + NewArgv[1] = safe_cmnd; + execve(_PATH_BSHELL, NewArgv, new_environ); } warning("unable to execute %s", safe_cmnd); exit(127); @@ -610,7 +609,9 @@ init_vars(sudo_mode) if ((sudo_mode & (MODE_SHELL | MODE_EDIT))) { char **dst, **src = NewArgv; - NewArgv = (char **) emalloc2((++NewArgc + 1), sizeof(char *)); + /* Allocate an extra slot for execve() failure (ENOEXEC). */ + NewArgv = (char **) emalloc2((++NewArgc + 2), sizeof(char *)); + NewArgv++; if (ISSET(sudo_mode, MODE_EDIT)) NewArgv[0] = "sudoedit"; else if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) -- 2.50.1