From: Todd C. Miller Date: Tue, 8 Feb 2005 03:50:42 +0000 (+0000) Subject: Alloc an extra slot in NewArgv. Removes the need to malloc an new X-Git-Tag: SUDO_1_7_0~719 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d27f06b5f101469aa7c3a1d408d63d9dcc372ce3;p=sudo Alloc an extra slot in NewArgv. Removes the need to malloc an new vector if execve() fails. --- 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))