Re: Environment handling broken in /bin/sh with changes to t,set,put}env()

From: Andrey Chernov <ache_at_nagual.pp.ru>
Date: Sat, 14 Jul 2007 04:41:16 +0400
On Fri, Jul 13, 2007 at 07:08:37PM -0500, Sean C. Farley wrote:
> different.  Are you saying that the addresses should not change for
> environ, environ[0-1] or all?

I try to say that *env() functions should avoid to change memory they not 
"own" when it is possible and feel free to change the memory they "own".

What standard says is that initial copying all environ to the internal 
structure and changing it afterwards (exluding putenv case) is 
the right thing (because *env() functions "owns" that memory).

To avoid even things like

nenv[0] = "PATH=/bin";
setenv("PATH", "/bin", 1);

fails, better way is to strdup() (i.e. copying) every string from the 
original environ and you already do that initially in build_env() but not 
do the safe way in previous merge_environ().

BTW, I find that code in build_env() very suspicious:

       if (environ[0] == NULL)
                goto SaveEnviron;
...
SaveEnviron:
        origEnviron = environ;
        environ = NULL;
        if (envVarsTotal > 0) {
...
       } else
                rtrnVal = 0;

        return (rtrnVal);

It ends up with environ = NULL; because envVarsTotal initialized to 0 i.e. 
makes from "environ[0] == NULL" case "environ == NULL" case which is 
different thing.

-- 
http://ache.pp.ru/
Received on Fri Jul 13 2007 - 22:41:18 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:14 UTC