Alloc an extra slot in NewArgv. Removes the need to malloc an new

vector if execve() fails.
This commit is contained in:
Todd C. Miller
2005-02-08 03:50:42 +00:00
parent 9a890467a7
commit d27f06b5f1

13
sudo.c
View File

@@ -446,11 +446,10 @@ main(argc, argv, envp)
* If we got here then execve() failed... * If we got here then execve() failed...
*/ */
if (errno == ENOEXEC) { if (errno == ENOEXEC) {
char **av = emalloc2(NewArgc + 2, sizeof(char *)); NewArgv--; /* at least one extra slot... */
av[0] = "sh"; NewArgv[0] = "sh";
av[1] = safe_cmnd; NewArgv[1] = safe_cmnd;
memcpy(av + 2, NewArgv + 1, NewArgc * sizeof(char *)); execve(_PATH_BSHELL, NewArgv, new_environ);
execve(_PATH_BSHELL, av, new_environ);
} }
warning("unable to execute %s", safe_cmnd); warning("unable to execute %s", safe_cmnd);
exit(127); exit(127);
@@ -610,7 +609,9 @@ init_vars(sudo_mode)
if ((sudo_mode & (MODE_SHELL | MODE_EDIT))) { if ((sudo_mode & (MODE_SHELL | MODE_EDIT))) {
char **dst, **src = NewArgv; 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)) if (ISSET(sudo_mode, MODE_EDIT))
NewArgv[0] = "sudoedit"; NewArgv[0] = "sudoedit";
else if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) else if (ISSET(sudo_mode, MODE_LOGIN_SHELL))