getenv in FreeBSD 7

Doug Hardie bc979 at lafn.org
Mon Apr 7 06:25:37 UTC 2008


On Apr 6, 2008, at 22:38, Jeremy Chadwick wrote:
> On Sun, Apr 06, 2008 at 08:18:20PM -0700, Doug Hardie wrote:
>> On Apr 6, 2008, at 17:54, Jeremy Chadwick wrote:
>>> On Sun, Apr 06, 2008 at 03:05:18PM -0700, Doug Hardie wrote:
>>>>
>>>> On Apr 6, 2008, at 14:52, Jeremy Chadwick wrote:
>>>>> On Sun, Apr 06, 2008 at 02:45:24PM -0700, Jeremy Chadwick wrote:
>>>>>> On Sun, Apr 06, 2008 at 02:37:06PM -0700, Doug Hardie wrote:
>>>>>>> Somewhere between FreeBSD 6.2 and 7.0 getenv has been changed to
>>>>>>> return
>>>>>>> a
>>>>>>> null if an environment variable is set but has no value.  I  
>>>>>>> don't find
>>>>>>> anything anywhere in the documentation/man pages on this.  As a
>>>>>>> result,
>>>>>>> you
>>>>>>> cannot distinguish between a variable that is not set and one  
>>>>>>> that is
>>>>>>> set
>>>>>>> to a value of "".  Is this a bug or a feature change?
>>>>>>
>>>>>> I'd begin peeking here:
>>>>>>
>>>>>> http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/ 
>>>>>> getenv.c
>>>>>
>>>>> Follow-up: the manpages between 6.3-PRERELEASE and 7.0-STABLE do
>>>>> document said change:
>>>>>
>>>>> http://www.freebsd.org/cgi/man.cgi?query=getenv&apropos=0&sektion=3&manpath=FreeBSD+6.3-RELEASE&format=html
>>>>
>>>> Says that if the environment variable is NOT IN THE ENVIRONMENT  
>>>> then null
>>>> is returned.  Setting the variable to "" does put it in the  
>>>> environment.
>>>> env returns it properly.
>>>>
>>>>>
>>>>>
>>>>> http://www.freebsd.org/cgi/man.cgi?query=getenv&apropos=0&sektion=3&manpath=FreeBSD+7.0-stable&format=html
>>>>
>>>> Same thing.  I find nothing documented about this change.
>>>
>>> I'm not sure where you're going with this.  I see it clearly in the
>>> ERRORS section.
>>
>> I didn't think that having a defined variable with the value ""  
>> would be an
>> error.  getenv does not return EINVAL but returns a zero.  I would  
>> have
>> expected some notification in the description of getenv.
>
> My apologies: I misread the manpage.  The ERRORS section applies to
> setenv(), putenv(), and unsetenv() -- not getenv().  So ignore my
> earlier claims about EINVAL being relevant to getenv().
>
> getenv() will either return a pointer to what the environment variable
> contains (and if empty (e.g. ""), it should stil return a pointer to a
> buffer that consists of nothing but NULL), or if getenv() returns NULL
> then it means the variable isn't set.

earlier today I definitely saw 0x0 returned for several hours.  Broke  
a bunch of my code.  One was in a core dump, the others were in gdb.   
Now its not doing that.

>
>
>>> But besides that, just like Bakul Shah, I cannot reproduce this  
>>> problem:
>>>
>>> $ uname -mr
>>> 7.0-STABLE amd64
>>> $ gcc -o z z.c
>>> $ ./z
>>> getenv(FOO) = (null)
>>> $ export FOO=yep
>>> $ ./z
>>> getenv(FOO) = yep
>>> export FOO=
>>> $ ./z
>>> getenv(FOO) =
>>> $ cat z.c
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>>
>>> int main(void)
>>> {
>>> char *e = getenv("FOO");
>>>
>>> printf("getenv(FOO) = %s\n", e);
>>> return 0;
>>> }
>>
>> At this time, it does return a pointer to "".  However, earlier  
>> today it
>> did not.  It returned a zero.  It was quite consistent for several  
>> hours.
>> I wonder if this is another issue with gdb.  It seems to be quite  
>> flakey on
>> 7.0.
>
> I'd expect there to be an immense amount of "random breakage" in all
> sorts of scripts on a system, ditto with Apache spawning CGIs which  
> rely
> on environment variables (REMOTE_ADDR comes to mind), if getenv() was
> unreliable.  The ports system, for example, relies heavily upon
> environment variables.

I have been relying on environment variables since 2.5.  Never had an  
issue till now.  While I do have heavily loaded servers that heavily  
use them, this paticular server is very lightly loaded and rarely uses  
them.

>
>
> As I was writing this, I was thinking if a local resource starvation
> issue could cause this (libc being unable to malloc some memory  
> without
> a proper failure check, or stack space running out), but after looking
> at getenv() and related functions, I don't see how this could be
> possible.
>
> The next time it happens, post here with some more details.   
> Definitely
> a mysterious one...

I agree.  I suspect though that it might be related to gdb.  I can't  
explain the first core dump, but I have encountered enough bugs with  
gdb that I have no problems with it being the cause.



More information about the freebsd-stable mailing list