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.
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"