Module Name: src Committed By: rillig Date: Sat Aug 22 20:31:50 UTC 2020
Modified Files: src/usr.bin/make: var.c src/usr.bin/make/unit-tests: varname-empty.exp varname-empty.mk Log Message: make(1): prevent assignment to the variable with the empty name To generate a diff of this commit: cvs rdiff -u -r1.457 -r1.458 src/usr.bin/make/var.c cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/varname-empty.exp \ src/usr.bin/make/unit-tests/varname-empty.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.457 src/usr.bin/make/var.c:1.458 --- src/usr.bin/make/var.c:1.457 Sat Aug 22 19:30:58 2020 +++ src/usr.bin/make/var.c Sat Aug 22 20:31:50 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.457 2020/08/22 19:30:58 sjg Exp $ */ +/* $NetBSD: var.c,v 1.458 2020/08/22 20:31:50 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.457 2020/08/22 19:30:58 sjg Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.458 2020/08/22 20:31:50 rillig 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.457 2020/08/22 19:30:58 sjg Exp $"); +__RCSID("$NetBSD: var.c,v 1.458 2020/08/22 20:31:50 rillig Exp $"); #endif #endif /* not lint */ #endif @@ -778,6 +778,7 @@ void Var_Set_with_flags(const char *name, const char *val, GNode *ctxt, VarSet_Flags flags) { + const char *unexpanded_name = name; char *name_freeIt = NULL; Var *v; @@ -786,16 +787,15 @@ Var_Set_with_flags(const char *name, con * here will override anything in a lower context, so there's not much * point in searching them all just to save a bit of memory... */ - if (strchr(name, '$') != NULL) { - const char *unexpanded_name = name; + if (strchr(name, '$') != NULL) name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES); - if (name[0] == '\0') { - VAR_DEBUG("Var_Set(\"%s\", \"%s\", ...) " - "name expands to empty string - ignored\n", - unexpanded_name, val); - free(name_freeIt); - return; - } + + if (name[0] == '\0') { + VAR_DEBUG("Var_Set(\"%s\", \"%s\", ...) " + "name expands to empty string - ignored\n", + unexpanded_name, val); + free(name_freeIt); + return; } if (ctxt == VAR_GLOBAL) { Index: src/usr.bin/make/unit-tests/varname-empty.exp diff -u src/usr.bin/make/unit-tests/varname-empty.exp:1.1 src/usr.bin/make/unit-tests/varname-empty.exp:1.2 --- src/usr.bin/make/unit-tests/varname-empty.exp:1.1 Sat Aug 22 20:23:14 2020 +++ src/usr.bin/make/unit-tests/varname-empty.exp Sat Aug 22 20:31:50 2020 @@ -1,3 +1,3 @@ -value -value value value +fallback +1 2 3 exit status 0 Index: src/usr.bin/make/unit-tests/varname-empty.mk diff -u src/usr.bin/make/unit-tests/varname-empty.mk:1.1 src/usr.bin/make/unit-tests/varname-empty.mk:1.2 --- src/usr.bin/make/unit-tests/varname-empty.mk:1.1 Sat Aug 22 20:23:14 2020 +++ src/usr.bin/make/unit-tests/varname-empty.mk Sat Aug 22 20:31:50 2020 @@ -1,4 +1,4 @@ -# $NetBSD: varname-empty.mk,v 1.1 2020/08/22 20:23:14 rillig Exp $ +# $NetBSD: varname-empty.mk,v 1.2 2020/08/22 20:31:50 rillig Exp $ # # Tests for the special variable with the empty name. # @@ -6,7 +6,8 @@ # This is because it is heavily used in the .for loop expansion, # as well as to generate arbitrary strings, as in ${:Ufallback}. -# Oops. +# Until 2020-08-22 it was possible to assign a value to the variable with +# the empty name, leading to all kinds of unexpected effects. != echo 'value' # The .for loop expands the expression ${i} to ${:U1}, ${:U2} and so on.