setenv() doesn't export unsetenv()ed variables to environ

From: YAMAMOTO, Taku <taku_at_tackymt.homeip.net>
Date: Mon, 10 Sep 2007 08:14:25 +0900
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
_at__at_ -492,7 +492,7 _at__at_ __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_at_tackymt.homeip.net>

      - A chicken is an egg's way of producing more eggs. -
Received on Sun Sep 09 2007 - 21:14:29 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:17 UTC