Date: Mon, 10 Sep 2007 08:17:36 +0900 From: "YAMAMOTO, Taku" <taku@tackymt.homeip.net> To: freebsd-current@freebsd.org Subject: Follow-up: setenv() doesn't export unsetenv()ed variables to environ Message-ID: <20070910081736.45268f60.taku@tackymt.homeip.net> In-Reply-To: <20070910081425.3c45bca7.taku@tackymt.homeip.net> References: <20070910081425.3c45bca7.taku@tackymt.homeip.net>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --Multipart=_Mon__10_Sep_2007_08_17_36_+0900_prmCFf2l=WNuJLww Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Ouch, the testcase had got stripped due to inappropriate MIME type. On Mon, 10 Sep 2007 08:14:25 +0900 "YAMAMOTO, Taku" <taku@tackymt.homeip.net> wrote: > 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. - > -- -|-__ 山本 拓 / YAMAMOTO, Taku | __ < <taku@tackymt.homeip.net> - A chicken is an egg's way of producing more eggs. - --Multipart=_Mon__10_Sep_2007_08_17_36_+0900_prmCFf2l=WNuJLww Content-Type: text/plain; name="setenvtest.c" Content-Disposition: attachment; filename="setenvtest.c" Content-Transfer-Encoding: 7bit #include <err.h> #include <string.h> #include <stdlib.h> int main(void) { if (setenv("HOGE", "foo", 1)) warn("setenv(1st)"); system("echo 'expecting \"foo\":' $HOGE"); if (unsetenv("HOGE")) warn("unsetenv(1st)"); if (setenv("HOGE", "bar", 1)) warn("setenv(2nd)"); system("echo 'expecting \"bar\":' $HOGE"); return 0; } --Multipart=_Mon__10_Sep_2007_08_17_36_+0900_prmCFf2l=WNuJLww--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070910081736.45268f60.taku>