]> granicus.if.org Git - sudo/commitdiff
Alloc an extra slot in NewArgv. Removes the need to malloc an new
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 8 Feb 2005 03:50:42 +0000 (03:50 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 8 Feb 2005 03:50:42 +0000 (03:50 +0000)
vector if execve() fails.

sudo.c

diff --git a/sudo.c b/sudo.c
index 089752dec0fa4c77f523a7b5dfeed93af6175c8b..ea50d9baf4fc7d7baecbca714fc4ef9f3fe84a7e 100644 (file)
--- 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))