Environment handling broken in /bin/sh with changes to
{get,set,put}env()
icaer
jony1116 at hotmail.com
Sun Jul 8 13:47:06 UTC 2007
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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe at 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.
More information about the freebsd-current
mailing list