From owner-svn-src-head@FreeBSD.ORG Tue Dec 1 16:02:01 2009 Return-Path: Delivered-To: svn-src-head@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 06F57106566B; Tue, 1 Dec 2009 16:02:01 +0000 (UTC) (envelope-from scf@FreeBSD.org) Received: from mail.farley.org (mail.farley.org [IPv6:2001:470:1f0f:20:2::11]) by mx1.freebsd.org (Postfix) with ESMTP id 96BE78FC12; Tue, 1 Dec 2009 16:02:00 +0000 (UTC) Received: from thor.farley.org (HPooka@thor.farley.org [IPv6:2001:470:1f0f:20:1::5]) by mail.farley.org (8.14.3/8.14.3) with ESMTP id nB1G1xFg081957; Tue, 1 Dec 2009 10:01:59 -0600 (CST) (envelope-from scf@FreeBSD.org) Date: Tue, 1 Dec 2009 10:01:59 -0600 (CST) From: "Sean C. Farley" To: Brian Feldman In-Reply-To: <200912010504.nB154VnS053167@svn.freebsd.org> Message-ID: References: <200912010504.nB154VnS053167@svn.freebsd.org> User-Agent: Alpine 2.00 (BSF 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Spam-Status: No, score=-2.6 required=4.0 tests=AWL,BAYES_00,NO_RELAYS autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on mail.farley.org Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r199983 - in head: lib/libc/stdlib tools/regression/environ X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Dec 2009 16:02:01 -0000 On Tue, 1 Dec 2009, Brian Feldman wrote: > I also fixed another inconsistency in getenv(3) where updating the > global environ pointer would not be reflected in the return values. > It would have taken an intermediary setenv(3)/putenv(3)/unsetenv(3) > in order to see the change. In the current code, if environ is replaced or none of the set/put/unset calls have been made, getenv() will use __findenv_environ() (searches environ directly) to find the entry. This is necessary since malloc() depends upon getenv() creating a cross-dependency. > @@ -426,22 +439,18 @@ getenv(const char *name) > } > > /* > - * An empty environment (environ or its first value) regardless if > - * environ has been copied before will return a NULL. > - * > - * If the environment is not empty, find an environment variable via > - * environ if environ has not been copied via an *env() call or been > - * replaced by a running program, otherwise, use the rebuilt > - * environment. > + * If we have not already allocated memory by performing > + * write operations on the environment, avoid doing so now. > */ > - if (environ == NULL || environ[0] == NULL) > - return (NULL); > - else if (envVars == NULL || environ != intEnviron) > + if (envVars == NULL) > return (__findenv_environ(name, nameLen)); > - else { > - envNdx = envVarsTotal - 1; > - return (__findenv(name, nameLen, &envNdx, true)); > - } > + > + /* Synchronize environment. */ > + if (__merge_environ() == -1) > + return (NULL); > + > + envNdx = envVarsTotal - 1; > + return (__findenv(name, nameLen, &envNdx, true)); > } Sean -- scf@FreeBSD.org