Date: Wed, 4 Jul 2007 19:01:23 +0400 From: Andrey Chernov <ache@nagual.pp.ru> To: Sean Farley <scf@FreeBSD.org>, src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/bin/df df.c src/bin/sh var.c src/include stdlib.h src/libexec/pppoed pppoed.c src/sys/sys param.h src/lib/libc/stdlib Makefile.inc getenv.3 getenv.c putenv.c setenv.c src/tools/regression/environ Makefile Makefile.envctl ... Message-ID: <20070704150123.GA31683@nagual.pp.ru> In-Reply-To: <20070704144249.GB31254@nagual.pp.ru> References: <200707040000.l6400gLs044775@repoman.freebsd.org> <20070704144249.GB31254@nagual.pp.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jul 04, 2007 at 06:42:49PM +0400, Andrey Chernov wrote: > On Wed, Jul 04, 2007 at 12:00:41AM +0000, Sean Farley wrote: > > Several patches to base utilities to handle the POSIX changes from > > Andrey Chernov's previous commit. A few I re-wrote to use setenv() > > instead of putenv(). > > Replacing putenv() with setenv() should care about the case when putenv() > uses getenv()-provided value directly, like in sh's var.c. It should be > copied by strdup() or something like first to not break env before > following setenv() call. > > In my patch I always care about this. Here is a patch which fix that and unsetenv("foo=bar") problem too. 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 4 Jul 2007 14:59:19 -0000 @@ -289,7 +289,7 @@ setvareq(char *s, int flags) { struct var *vp, **vpp; - char *p; + char *p, *ss; int len; if (aflag) @@ -320,10 +320,11 @@ if (vp == &vmpath || (vp == &vmail && ! mpathset())) chkmail(1); if ((vp->flags & VEXPORT) && localevar(s)) { - p = strchr(s, '='); + ss = savestr(s); + p = strchr(ss, '='); *p = '\0'; - (void) setenv(s, p + 1, 1); - *p = '='; + (void) setenv(ss, p + 1, 1); + ckfree(ss); (void) setlocale(LC_ALL, ""); } INTON; @@ -339,10 +340,11 @@ INTOFF; *vpp = vp; if ((vp->flags & VEXPORT) && localevar(s)) { - p = strchr(s, '='); + ss = savestr(s); + p = strchr(ss, '='); *p = '\0'; - (void) setenv(s, p + 1, 1); - *p = '='; + (void) setenv(ss, p + 1, 1); + ckfree(ss); (void) setlocale(LC_ALL, ""); } INTON; @@ -567,7 +569,7 @@ struct var **vpp; struct var *vp; char *name; - char *p; + char *p, *ss; char *cmdname; int ch, values; int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT; @@ -603,10 +605,11 @@ vp->flags |= flag; if ((vp->flags & VEXPORT) && localevar(vp->text)) { - p = strchr(vp->text, '='); + ss = savestr(vp->text); + p = strchr(ss, '='); *p = '\0'; - (void) setenv(vp->text, p + 1, 1); - *p = '='; + (void) setenv(ss, p + 1, 1); + ckfree(ss); (void) setlocale(LC_ALL, ""); } goto found; @@ -788,6 +791,7 @@ { struct var **vpp; struct var *vp; + char *ss, *eqp; vpp = hashvar(s); for (vp = *vpp ; vp ; vpp = &vp->next, vp = *vpp) { @@ -798,7 +802,11 @@ if (*(strchr(vp->text, '=') + 1) != '\0') setvar(s, nullstr, 0); if ((vp->flags & VEXPORT) && localevar(vp->text)) { - unsetenv(s); + ss = savestr(s); + if ((eqp = strchr(ss, '=')) != NULL) + *eqp = '\0'; + (void) unsetenv(ss); + ckfree(ss); setlocale(LC_ALL, ""); } vp->flags &= ~VEXPORT; -- http://ache.pp.ru/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070704150123.GA31683>