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

From: Andrey Chernov <ache_at_nagual.pp.ru>
Date: Sun, 8 Jul 2007 21:17:27 +0400
On Sun, Jul 08, 2007 at 06:09:40AM +0400, Andrey Chernov wrote:
> On Sat, Jul 07, 2007 at 09:03:59PM -0500, Sean C. Farley wrote:
> > 
> > Surprisingly, keeping the pointers saved time even if calling setenv().
> 
> Ok. It feels like time to commit comes :)

Hmm. I just think a bit more and feel worry about that place in the merge 
code:

	*equals = '\0';
        if (setenv(*env, equals + 1, 1) == -1)
                return (-1);
        *equals = '=';
because it modifies memory which may be treated like const one.

Consider following scenario: getenv() is not thread-safe, but may be 
called by thread-safe app if it is sure no other *env() calls in progress. 
In the same time another thread of this app use environ directly say for 
exec(), assuming it is const. In the middle of that getenv() modifies 
environ by *equals = '\0';

Could you please make setenv() wrapper like that to avoid modifying merged 
environ in the middle?
	__lsetenv(str, str_len, value)

-- 
http://ache.pp.ru/
Received on Sun Jul 08 2007 - 15:17:31 UTC

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