Index: var.c =================================================================== RCS file: /home/ncvs/src/bin/sh/var.c,v retrieving revision 1.36 diff -u -r1.36 var.c --- var.c 4 Jul 2007 00:00:38 -0000 1.36 +++ var.c 5 Jul 2007 15:46:50 -0000 @@ -278,6 +278,30 @@ return 0; } + +/* + * Sets/unsets an environment variable from a pointer that may actually be a + * pointer into environ where the string should not be manipulated. + */ +static void +change_env(char *s, int set) +{ + char *eqp; + char *ss; + + ss = savestr(s); + if ((eqp = strchr(ss, '=')) != NULL) + *eqp = '\0'; + if (set && eqp != NULL) + (void) setenv(ss, eqp + 1, 1); + else + (void) unsetenv(ss); + ckfree(ss); + + return; +} + + /* * Same as setvar except that the variable and value are passed in * the first argument as name=value. Since the first argument will @@ -289,7 +313,6 @@ setvareq(char *s, int flags) { struct var *vp, **vpp; - char *p; int len; if (aflag) @@ -320,10 +343,7 @@ if (vp == &vmpath || (vp == &vmail && ! mpathset())) chkmail(1); if ((vp->flags & VEXPORT) && localevar(s)) { - p = strchr(s, '='); - *p = '\0'; - (void) setenv(s, p + 1, 1); - *p = '='; + change_env(s, 1); (void) setlocale(LC_ALL, ""); } INTON; @@ -339,10 +359,7 @@ INTOFF; *vpp = vp; if ((vp->flags & VEXPORT) && localevar(s)) { - p = strchr(s, '='); - *p = '\0'; - (void) setenv(s, p + 1, 1); - *p = '='; + change_env(s, 1); (void) setlocale(LC_ALL, ""); } INTON; @@ -603,10 +620,7 @@ vp->flags |= flag; if ((vp->flags & VEXPORT) && localevar(vp->text)) { - p = strchr(vp->text, '='); - *p = '\0'; - (void) setenv(vp->text, p + 1, 1); - *p = '='; + change_env(vp->text, 1); (void) setlocale(LC_ALL, ""); } goto found; @@ -798,7 +812,7 @@ if (*(strchr(vp->text, '=') + 1) != '\0') setvar(s, nullstr, 0); if ((vp->flags & VEXPORT) && localevar(vp->text)) { - unsetenv(s); + change_env(s, 0); setlocale(LC_ALL, ""); } vp->flags &= ~VEXPORT;