Date: Mon, 10 Sep 2007 08:14:25 +0900 From: "YAMAMOTO, Taku" <taku@tackymt.homeip.net> To: freebsd-current@freebsd.org Subject: setenv() doesn't export unsetenv()ed variables to environ Message-ID: <20070910081425.3c45bca7.taku@tackymt.homeip.net>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--Multipart=_Mon__10_Sep_2007_08_14_25_+0900_cqp7R7NAls_11qb1
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Greetings,
I found a regression in src/lib/libc/stdlib/getenv.c during tracking
strange behaviour of the sshguard-pf.
In short, setenv() doesn't add an entry to environ[] if the name was
once removed by unsetenv().
I'm suspecting the function __setenv() lacks care of the case to reuse
a deactivated entry and it needs the following change:
--- lib/libc/stdlib/getenv.c.orig 2007-07-21 08:30:13.000000000 +0900
+++ lib/libc/stdlib/getenv.c 2007-09-10 08:07:22.732672106 +0900
@@ -492,7 +492,7 @@ __setenv(const char *name, size_t nameLe
newEnvActive++;
/* No need to rebuild environ if the variable was reused. */
- if (reuse)
+ if (reuse && newEnvActive == envActive)
return (0);
else
return (__rebuild_environ(newEnvActive));
A small testcase is attached.
It should emit:
expecting "foo": foo
expecting "bar": bar
With current broken setenv(), it would emit:
expecting "foo": foo
expecting "bar":
--
-|-__ YAMAMOTO, Taku
| __ < <taku@tackymt.homeip.net>
- A chicken is an egg's way of producing more eggs. -
--Multipart=_Mon__10_Sep_2007_08_14_25_+0900_cqp7R7NAls_11qb1--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070910081425.3c45bca7.taku>
