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

Sean C. Farley scf at FreeBSD.org
Wed Jul 4 15:39:07 UTC 2007


On Wed, 4 Jul 2007, Andrey Chernov wrote:

> On Wed, Jul 04, 2007 at 10:12:18AM -0500, Sean C. Farley wrote:
>> On Wed, 4 Jul 2007, Andrey Chernov 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:
>>
>> Andrey, thank you.
>>
>> Sorry for the bug everyone.  Here is a patch that should fix it:
>> http://www.farley.org/freebsd/tmp/setenv/sh.patch
>
> Looks good excepting one moment. What happens if eqp == NULL here?
>
> +	if ((eqp = strchr(ss, '=')) != NULL)
> +		*eqp = '\0';
> +	if (set)
> +		(void) setenv(ss, eqp + 1, 1);
> +	else
> +		(void) unsetenv(ss);
>
> IMHO it should be changed to
>
> 	if (set && eqp != NULL)
>
> i.e. go to unsetenv() for values without "="

Good point.  I updated the patch.

Sean
-- 
scf at FreeBSD.org


More information about the freebsd-current mailing list