Date: Sun, 8 Jul 2007 06:28:47 -0700 (PDT) From: icaer <jony1116@hotmail.com> To: freebsd-current@freebsd.org Subject: Re: Environment handling broken in /bin/sh with changes to {get,set,put}env() Message-ID: <11488718.post@talk.nabble.com> In-Reply-To: <20070704150312.GB31683@nagual.pp.ru> References: <1183557221.1799.16.camel@genius.i.cz> <20070704143642.GA31254@nagual.pp.ru> <20070704150312.GB31683@nagual.pp.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, How to apply this patch,if I want to correct it? rebuild the world?or other method. I try to get the new code by cvsup.But it compiled error( http://www.nabble.com/buildworld-error-tf4032292.html http://www.nabble.com/buildworld-error-tf4032292.html ).So I shouldn't correct this problem. it's bad news for me,I have focus on this problem for 3 days.... Andrey Chernov-2 wrote: > > On Wed, Jul 04, 2007 at 06:36:42PM +0400, Andrey Chernov wrote: >> 2) "s" may point to getenv()-provided value there. So just modifying it >> directly followed by setenv() call will make things inconsistent. >> >> 3) In my version of patch there was savestr() which copy arg to avoid >> this >> situation. >> >> Fix will be to restore var.c to mine variant 1.34 > > You may also try this patch against var.c 1.36: > > 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/ > _______________________________________________ > freebsd-current@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" > > -- View this message in context: http://www.nabble.com/Environment-handling-broken-in--bin-sh-with-changes-to-%7Bget%2Cset%2Cput%7Denv%28%29-tf4024589.html#a11488718 Sent from the freebsd-current mailing list archive at Nabble.com.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?11488718.post>