Alloc an extra slot in NewArgv. Removes the need to malloc an new
vector if execve() fails.
This commit is contained in:
13
sudo.c
13
sudo.c
@@ -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))
|
||||||
|
Reference in New Issue
Block a user