Module Name: src Committed By: sjg Date: Mon Jun 4 20:34:21 UTC 2012
Modified Files: src/usr.bin/make: make.h util.c var.c Log Message: Var_UnExport() and setenv() can both realloc environ. Use a common variable (savedEnv) to track that to avoid wasting memory. Also, if providing setenv and unsetenv, do getenv too to ensure a consistent set. To generate a diff of this commit: cvs rdiff -u -r1.87 -r1.88 src/usr.bin/make/make.h cvs rdiff -u -r1.51 -r1.52 src/usr.bin/make/util.c cvs rdiff -u -r1.169 -r1.170 src/usr.bin/make/var.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/make.h diff -u src/usr.bin/make/make.h:1.87 src/usr.bin/make/make.h:1.88 --- src/usr.bin/make/make.h:1.87 Fri Sep 16 15:38:04 2011 +++ src/usr.bin/make/make.h Mon Jun 4 20:34:20 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: make.h,v 1.87 2011/09/16 15:38:04 joerg Exp $ */ +/* $NetBSD: make.h,v 1.88 2012/06/04 20:34:20 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -401,6 +401,7 @@ extern Lst defIncPath; /* The default in extern char curdir[]; /* Startup directory */ extern char *progname; /* The program name */ extern char *makeDependfile; /* .depend */ +extern char **savedEnv; /* if we replaced environ this will be non-NULL */ /* * We cannot vfork() in a child of vfork(). Index: src/usr.bin/make/util.c diff -u src/usr.bin/make/util.c:1.51 src/usr.bin/make/util.c:1.52 --- src/usr.bin/make/util.c:1.51 Sat Apr 2 07:58:30 2011 +++ src/usr.bin/make/util.c Mon Jun 4 20:34:20 2012 @@ -1,15 +1,15 @@ -/* $NetBSD: util.c,v 1.51 2011/04/02 07:58:30 mbalmer Exp $ */ +/* $NetBSD: util.c,v 1.52 2012/06/04 20:34:20 sjg Exp $ */ /* * Missing stuff from OS's */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: util.c,v 1.51 2011/04/02 07:58:30 mbalmer Exp $"; +static char rcsid[] = "$NetBSD: util.c,v 1.52 2012/06/04 20:34:20 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: util.c,v 1.51 2011/04/02 07:58:30 mbalmer Exp $"); +__RCSID("$NetBSD: util.c,v 1.52 2012/06/04 20:34:20 sjg Exp $"); #endif #endif @@ -61,6 +61,14 @@ findenv(const char *name, int *offset) return NULL; } +char * +getenv(const char *name) +{ + int offset; + + return(findenv(name, &offset)); +} + int unsetenv(const char *name) { @@ -83,7 +91,6 @@ unsetenv(const char *name) int setenv(const char *name, const char *value, int rewrite) { - static char **saveenv; /* copy of previously allocated space */ char *c, **newenv; const char *cc; size_t l_value, size; @@ -106,20 +113,20 @@ setenv(const char *name, const char *val goto copy; } else { /* create new slot */ size = sizeof(char *) * (offset + 2); - if (saveenv == environ) { /* just increase size */ - if ((newenv = realloc(saveenv, size)) == NULL) + if (savedEnv == environ) { /* just increase size */ + if ((newenv = realloc(savedEnv, size)) == NULL) return -1; - saveenv = newenv; + savedEnv = newenv; } else { /* get new space */ /* * We don't free here because we don't know if * the first allocation is valid on all OS's */ - if ((saveenv = malloc(size)) == NULL) + if ((savedEnv = malloc(size)) == NULL) return -1; - (void)memcpy(saveenv, environ, size - sizeof(char *)); + (void)memcpy(savedEnv, environ, size - sizeof(char *)); } - environ = saveenv; + environ = savedEnv; environ[offset + 1] = NULL; } for (cc = name; *cc && *cc != '='; ++cc) /* no `=' in name */ Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.169 src/usr.bin/make/var.c:1.170 --- src/usr.bin/make/var.c:1.169 Fri May 18 02:28:16 2012 +++ src/usr.bin/make/var.c Mon Jun 4 20:34:20 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.169 2012/05/18 02:28:16 sjg Exp $ */ +/* $NetBSD: var.c,v 1.170 2012/06/04 20:34:20 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.169 2012/05/18 02:28:16 sjg Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.170 2012/06/04 20:34:20 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.169 2012/05/18 02:28:16 sjg Exp $"); +__RCSID("$NetBSD: var.c,v 1.170 2012/06/04 20:34:20 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -140,6 +140,12 @@ __RCSID("$NetBSD: var.c,v 1.169 2012/05/ #include "job.h" /* + * This lets us tell if we have replaced the original environ + * (which we cannot free). + */ +char **savedEnv = NULL; + +/* * This is a harmless return value for Var_Parse that can be used by Var_Subst * to determine if there was an error in parsing -- easier than returning * a flag, as things outside this module don't give a hoot. @@ -762,24 +768,23 @@ Var_UnExport(char *str) str += 8; unexport_env = (strncmp(str, "-env", 4) == 0); if (unexport_env) { - static char **savenv; char **newenv; cp = getenv(MAKE_LEVEL); /* we should preserve this */ - if (environ == savenv) { + if (environ == savedEnv) { /* we have been here before! */ newenv = bmake_realloc(environ, 2 * sizeof(char *)); } else { - if (savenv) { - free(savenv); - savenv = NULL; + if (savedEnv) { + free(savedEnv); + savedEnv = NULL; } newenv = bmake_malloc(2 * sizeof(char *)); } if (!newenv) return; /* Note: we cannot safely free() the original environ. */ - environ = savenv = newenv; + environ = savedEnv = newenv; newenv[0] = NULL; newenv[1] = NULL; setenv(MAKE_LEVEL, cp, 1);