[Bug 298747] clearenv() segfaults when the environment is already empty
Date: Fri, 25 Sep 2026 19:58:38 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=298747
--- Comment #4 from Leo Bicknell <bicknell@ufp.org> ---
(In reply to Konstantin Belousov from comment #3)
Yes, that is the exact question. And now I'm kinda sorry I went down this
rabbit hole at all, but I did...
The direct issue. With this patch this program:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {
clearenv();
printf("envp == %p\n", (void *)envp);
return 0;
}
Will print out a pointer when called with something in the environment, and
will print out NULL when called with "env -i ./a.out". I think that would
surprise many developers.
Now, is NULL legal/valid? Comparing with other docs:
man 7 environ says "An array of strings", and does not contain the word NULL.
man 2 execve says "The argument envp is also a pointer to a null-terminated
array of character pointers to null-terminated strings."
man 2 exec also states EFAULT is returned if "The path, argv, or envp arguments
point to an illegal address".
However, I also think that last man page is not completely accurate. If I
point to a truly illegal address I get EFAULT as expected
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[], char *envp[]) {
char *myargs[] = { "echo", "hello", NULL };
char **badenv = (char **)0xAABBCCDDEEFFAABB;
int x = execvpe("/bin/echo", myargs, badenv);
printf("x = %d - %d %s\n", x, errno, strerror(errno));
}
Executing it on my 15.1 box it returns:
x = -1 - 14 Bad address
But if I point it to NULL:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[], char *envp[]) {
char *myargs[] = { "echo", "hello", NULL };
int x = execvpe("/bin/echo", myargs, NULL);
printf("x = %d - %d %s\n", x, errno, strerror(errno));
}
It prints "hello" as expected. NULL is clearly not considered an illegal
address, but I would have guessed it was from the man page.
I am not clear if the right answer is "allocate zero-sized environment" in this
patch, or if the right answer is to tighten up the docs and make it clear NULL
is a valid, expected value for envp in some cases, or perhaps both? Maybe I am
just a confused user. I defer that call to FreeBSD team.
Apologies for opening a can of worms.
--
You are receiving this mail because:
You are the assignee for the bug.