]> granicus.if.org Git - sudo/commitdiff
Inline the setting of the environment string.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 25 Apr 2009 16:49:22 +0000 (16:49 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 25 Apr 2009 16:49:22 +0000 (16:49 +0000)
env.c

diff --git a/env.c b/env.c
index eca2fcb8586d51bb6e481297b8190dc1419d1355..c9a93ca7e7c0e8701ca62acdc20f7d567a88521a 100644 (file)
--- a/env.c
+++ b/env.c
@@ -249,27 +249,31 @@ setenv(var, val, overwrite)
     const char *val;
     int overwrite;
 {
-    char *estring;
-    const char *varend;
+    char *estring, *ep;
+    const char *cp;
     size_t esize;
-    int len;
 
     /*
      * POSIX says a var name with '=' is an error but BSD
      * just ignores the '=' and anything after it.
      */
-    for (varend = var; *varend && *varend != '='; varend++)
+    for (cp = var; *cp && *cp != '='; cp++)
        ;
+    esize = (size_t)(cp - var) + 2;
+    if (val) {
+       esize += strlen(val);   /* glibc treats a NULL val as "" */
+    }
 
-    if (val == NULL)
-       val = "";               /* glibc treats a NULL val as "" */
-
-    esize = (size_t)(varend - var) + 1 + strlen(val) + 1;
-    estring = emalloc(esize);
-
-    len = snprintf(estring, esize, "%.*s=%s", (int)(varend - var), var, val);
-    if (len < 0 && len >= esize)
-       errorx(1, "internal error, setenv() overflow");
+    /* Allocate and fill in estring. */
+    estring = ep = emalloc(esize);
+    for (cp = var; *cp && *cp != '='; cp++)
+       *ep++ = *cp;
+    *ep++ = '=';
+    if (val) {
+       for (cp = val; *cp; cp++)
+           *ep++ = *cp;
+    }
+    *ep = '\0';
 
     /* Sync env.envp with environ as needed. */
     if (env.envp != environ) {