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>