Environment handling broken in /bin/sh with changes to
t,set,put}env()
Andrey Chernov
ache at nagual.pp.ru
Sat Jul 14 00:41:18 UTC 2007
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/
More information about the freebsd-current
mailing list