Environment handling broken in /bin/sh with changes to {get,set,put}env()

Andrey Chernov ache at nagual.pp.ru
Fri Jul 13 20:24:36 UTC 2007


On Fri, Jul 13, 2007 at 02:39:30PM -0500, Sean C. Farley wrote:
> FreeBSD 6 will also dump if the length of the value was less than or
> equal to "/bin" since it reuses this string.  This will core dump:
> 
> nenv[0] = "PATH=/bin";
> nenv[1] = NULL;
> environ = nenv;
> setenv("PATH", "/bin", 1);

1) I care in first hand about unsetenv() as my example states. There 
nowhere said in the specs that unsetenv() may modify environ _content_, 
manpage says about pointers only.

2) That example not fail under FreeBSD 6 but fail under new code:

nenv[0] = "PATH=/bin";
nenv[1] = NULL;
environ = nenv;
setenv("HOME", "/xxx", 1);

(that is because new code will touch "PATH=/bin" string in anycase while 
old ones looks for "HOME" only).

The most safest way is do not touch environ content outside of 
scope of requested modification. That means I agree that
nenv[0] = "PATH=/bin";
setenv("PATH", "/bin", 1);
may fail, but not about the cases 1) and 2)

-- 
http://ache.pp.ru/


More information about the freebsd-current mailing list