]> granicus.if.org Git - sudo/commitdiff
Do not rely on env.env_len when unsetting a variable, just use the
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 29 Jun 2010 13:26:21 +0000 (09:26 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 29 Jun 2010 13:26:21 +0000 (09:26 -0400)
NULL terminator.

--HG--
branch : 1.7

env.c

diff --git a/env.c b/env.c
index 80fa45b379ed3a08cd7049805f272415089cd915..59b59eb3425d9da917427414b334e20857ae2cce 100644 (file)
--- a/env.c
+++ b/env.c
@@ -378,15 +378,16 @@ unsetenv(var)
     len = strlen(var);
     for (ep = env.envp; *ep != NULL;) {
        if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') {
-           /* Found it; shift remainder + NULL over by one and update len. */
-           memmove(ep, ep + 1,
-               (env.env_len - (ep - env.envp)) * sizeof(char *));
-           env.env_len--;
+           /* Found it; shift remainder + NULL over by one. */
+           char **cur = ep;
+           while ((*cur = *(cur + 1)) != NULL)
+               cur++;
            /* Keep going, could be multiple instances of the var. */
        } else {
            ep++;
        }
     }
+    env.env_len = ep - env.envp;
 #ifndef UNSETENV_VOID
     return(0);
 #endif
@@ -470,13 +471,14 @@ sudo_putenv(str, dupcheck, overwrite)
        if (found && overwrite) {
            while (*ep != NULL) {
                if (strncmp(str, *ep, len) == 0) {
-                   memmove(ep, ep + 1,
-                       (env.env_len - (ep - env.envp)) * sizeof(char *));
-                   env.env_len--;
+                   char **cur = ep;
+                   while ((*cur = *(cur + 1)) != NULL)
+                       cur++;
                } else {
                    ep++;
                }
            }
+           env.env_len = ep - env.envp;
        }
     }