Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Dec 2009 23:05:18 +0000 (UTC)
From:      Sean Farley <scf@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r200190 - head/lib/libc/stdlib
Message-ID:  <200912062305.nB6N5I2S034464@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: scf
Date: Sun Dec  6 23:05:17 2009
New Revision: 200190
URL: http://svn.freebsd.org/changeset/base/200190

Log:
  Improve the comment within getenv() explaining the search order it takes to
  find a variable.  Include a note that it must not cause the internal
  environment to be generated since malloc() depends upon getenv().  To call
  malloc() would create a circular dependency.
  
  Recommended by:	green
  Approved by:	jilles
  MFC after:	1 week

Modified:
  head/lib/libc/stdlib/getenv.c

Modified: head/lib/libc/stdlib/getenv.c
==============================================================================
--- head/lib/libc/stdlib/getenv.c	Sun Dec  6 22:14:58 2009	(r200189)
+++ head/lib/libc/stdlib/getenv.c	Sun Dec  6 23:05:17 2009	(r200190)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2007-2008 Sean C. Farley <scf@FreeBSD.org>
+ * Copyright (c) 2007-2009 Sean C. Farley <scf@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -160,7 +160,7 @@ __findenv(const char *name, size_t nameL
 
 	/*
 	 * Find environment variable from end of array (more likely to be
-	 * active).  A variable created by putenv is always active or it is not
+	 * active).  A variable created by putenv is always active, or it is not
 	 * tracked in the array.
 	 */
 	for (ndx = *envNdx; ndx >= 0; ndx--)
@@ -426,13 +426,14 @@ getenv(const char *name)
 	}
 
 	/*
-	 * An empty environment (environ or its first value) regardless if
-	 * environ has been copied before will return a NULL.
+	 * Variable search order:
+	 * 1. Check for an empty environ.  This allows an application to clear
+	 *    the environment.
+	 * 2. Search the external environ array.
+	 * 3. Search the internal environment.
 	 *
-	 * 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.
+	 * Since malloc() depends upon getenv(), getenv() must never cause the
+	 * internal environment storage to be generated.
 	 */
 	if (environ == NULL || environ[0] == NULL)
 		return (NULL);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912062305.nB6N5I2S034464>