Module Name: src
Committed By: rillig
Date: Sat Mar 26 12:44:57 UTC 2022
Modified Files:
src/usr.bin/make: var.c
src/usr.bin/make/unit-tests: Makefile directive-undef.mk
Log Message:
make: fix crash on .undef of an environment variable (since 2020-10-06)
To generate a diff of this commit:
cvs rdiff -u -r1.1013 -r1.1014 src/usr.bin/make/var.c
cvs rdiff -u -r1.310 -r1.311 src/usr.bin/make/unit-tests/Makefile
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/make/unit-tests/directive-undef.mk
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/var.c
diff -u src/usr.bin/make/var.c:1.1013 src/usr.bin/make/var.c:1.1014
--- src/usr.bin/make/var.c:1.1013 Thu Mar 3 19:52:41 2022
+++ src/usr.bin/make/var.c Sat Mar 26 12:44:57 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1013 2022/03/03 19:52:41 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1014 2022/03/26 12:44:57 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -139,7 +139,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1013 2022/03/03 19:52:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1014 2022/03/26 12:44:57 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -1088,20 +1088,14 @@ Var_Append(GNode *scope, const char *nam
DEBUG3(VAR, "%s: %s = %s\n", scope->name, name, v->val.data);
if (v->fromEnvironment) {
- /*
- * The variable originally came from the environment.
- * Install it in the global scope (we could place it
- * in the environment, but then we should provide a
- * way to export other variables...)
- */
- v->fromEnvironment = false;
+ /* See VarAdd. */
+ HashEntry *he =
+ HashTable_CreateEntry(&scope->vars, name, NULL);
+ HashEntry_Set(he, v);
+ FStr_Done(&v->name);
+ v->name = FStr_InitRefer(/* aliased to */ he->key);
v->shortLived = false;
- /*
- * This is the only place where a variable is
- * created in a scope, where v->name does not alias
- * scope->vars->key.
- */
- HashTable_Set(&scope->vars, name, v);
+ v->fromEnvironment = false;
}
}
}
Index: src/usr.bin/make/unit-tests/Makefile
diff -u src/usr.bin/make/unit-tests/Makefile:1.310 src/usr.bin/make/unit-tests/Makefile:1.311
--- src/usr.bin/make/unit-tests/Makefile:1.310 Fri Mar 25 22:38:39 2022
+++ src/usr.bin/make/unit-tests/Makefile Sat Mar 26 12:44:57 2022
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.310 2022/03/25 22:38:39 rillig Exp $
+# $NetBSD: Makefile,v 1.311 2022/03/26 12:44:57 rillig Exp $
#
# Unit tests for make(1)
#
@@ -467,6 +467,7 @@ TESTS:= ${TESTS:${BROKEN_TESTS:S,^,N,:ts
# Additional environment variables for some of the tests.
# The base environment is -i PATH="$PATH".
ENV.depsrc-optional+= TZ=UTC
+ENV.directive-undef= ENV_VAR=env-value
ENV.envfirst= FROM_ENV=value-from-env
ENV.varmisc= FROM_ENV=env
ENV.varmisc+= FROM_ENV_BEFORE=env
Index: src/usr.bin/make/unit-tests/directive-undef.mk
diff -u src/usr.bin/make/unit-tests/directive-undef.mk:1.11 src/usr.bin/make/unit-tests/directive-undef.mk:1.12
--- src/usr.bin/make/unit-tests/directive-undef.mk:1.11 Fri Mar 25 23:03:47 2022
+++ src/usr.bin/make/unit-tests/directive-undef.mk Sat Mar 26 12:44:57 2022
@@ -1,4 +1,4 @@
-# $NetBSD: directive-undef.mk,v 1.11 2022/03/25 23:03:47 rillig Exp $
+# $NetBSD: directive-undef.mk,v 1.12 2022/03/26 12:44:57 rillig Exp $
#
# Tests for the .undef directive.
#
@@ -130,4 +130,16 @@ INDIRECT= in-${DIRECT}
.endif
+# Since var.c 1.570 from 2020-10-06 and before var.c 1.1014 from 2022-03-26,
+# make ran into an assertion failure when trying to undefine a variable that
+# was based on an environment variable.
+.if ${ENV_VAR} != "env-value" # see ./Makefile, ENV.directive-undef
+. error
+.endif
+ENV_VAR+= appended # moves the short-lived variable to the
+ # global scope
+.undef ENV_VAR # removes the variable from both the global
+ # scope and from the environment
+
+
all: