Module Name: src Committed By: rillig Date: Wed Feb 3 08:40:47 UTC 2021
Modified Files: src/usr.bin/make: var.c src/usr.bin/make/unit-tests: var-op-append.exp var-op-append.mk varname-empty.exp Log Message: make: fix double expansion when appending to a new variable To generate a diff of this commit: cvs rdiff -u -r1.792 -r1.793 src/usr.bin/make/var.c cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/var-op-append.exp cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/var-op-append.mk cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/varname-empty.exp 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.792 src/usr.bin/make/var.c:1.793 --- src/usr.bin/make/var.c:1.792 Wed Feb 3 08:08:18 2021 +++ src/usr.bin/make/var.c Wed Feb 3 08:40:47 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.792 2021/02/03 08:08:18 rillig Exp $ */ +/* $NetBSD: var.c,v 1.793 2021/02/03 08:40:47 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -131,7 +131,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.792 2021/02/03 08:08:18 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.793 2021/02/03 08:40:47 rillig Exp $"); typedef enum VarFlags { VAR_NONE = 0, @@ -916,6 +916,12 @@ SetVar(const char *name, const char *val { Var *v; + assert(val != NULL); + if (name[0] == '\0') { + DEBUG0(VAR, "SetVar: variable name is empty - ignored\n"); + return; + } + if (ctxt == VAR_GLOBAL) { v = VarFind(name, VAR_CMDLINE, FALSE); if (v != NULL) { @@ -1034,12 +1040,7 @@ Var_Set(const char *name, const char *va void Global_Set(const char *name, const char *value) { - assert(value != NULL); - - if (name[0] == '\0') - DEBUG0(VAR, "Variable name empty - ignored\n"); - else - SetVar(name, value, VAR_GLOBAL, VAR_SET_NONE); + SetVar(name, value, VAR_GLOBAL, VAR_SET_NONE); } void @@ -1093,8 +1094,7 @@ Var_Append(const char *name, const char v = VarFind(name, ctxt, ctxt == VAR_GLOBAL); if (v == NULL) { - /* XXX: name is expanded for the second time */ - Var_Set(name, val, ctxt); + SetVar(name, val, ctxt, VAR_SET_NONE); } else if (v->flags & VAR_READONLY) { DEBUG1(VAR, "Ignoring append to %s since it is read-only\n", name); Index: src/usr.bin/make/unit-tests/var-op-append.exp diff -u src/usr.bin/make/unit-tests/var-op-append.exp:1.3 src/usr.bin/make/unit-tests/var-op-append.exp:1.4 --- src/usr.bin/make/unit-tests/var-op-append.exp:1.3 Tue Feb 2 16:18:16 2021 +++ src/usr.bin/make/unit-tests/var-op-append.exp Wed Feb 3 08:40:47 2021 @@ -1,7 +1,7 @@ Var_Parse: ${:U\$\$\$\$\$\$\$\$} with VARE_WANTRES Applying ${:U...} to "" (VARE_WANTRES, none, VES_UNDEF) Result of ${:U\$\$\$\$\$\$\$\$} is "$$$$$$$$" (VARE_WANTRES, none, VES_DEF) -Global:VAR.$$$$ = dollars +Global:VAR.$$$$$$$$ = dollars Global:.MAKEFLAGS = -r -k -d v -d Global:.MAKEFLAGS = -r -k -d v -d 0 exit status 0 Index: src/usr.bin/make/unit-tests/var-op-append.mk diff -u src/usr.bin/make/unit-tests/var-op-append.mk:1.7 src/usr.bin/make/unit-tests/var-op-append.mk:1.8 --- src/usr.bin/make/unit-tests/var-op-append.mk:1.7 Fri Oct 30 20:36:33 2020 +++ src/usr.bin/make/unit-tests/var-op-append.mk Wed Feb 3 08:40:47 2021 @@ -1,4 +1,4 @@ -# $NetBSD: var-op-append.mk,v 1.7 2020/10/30 20:36:33 rillig Exp $ +# $NetBSD: var-op-append.mk,v 1.8 2021/02/03 08:40:47 rillig Exp $ # # Tests for the += variable assignment operator, which appends to a variable, # creating it if necessary. @@ -32,17 +32,15 @@ C++= value . error .endif -# Try out how often the variable name is expanded when appending to a -# nonexistent variable. -# As of 2020-10-30, that's two times. -# XXX: That's one time too often. -# See Var_Append, the call to Var_Set. +# Before var.c 1.793 from 2021-02-03, the variable name of a newly created +# variable was expanded two times in a row, which was unexpected but +# irrelevant in practice since variable names containing dollars lead to +# strange side effects in several other places as well. .MAKEFLAGS: -dv VAR.${:U\$\$\$\$\$\$\$\$}+= dollars .MAKEFLAGS: -d0 -.if ${VAR.${:U\$\$\$\$}} != "dollars" +.if ${VAR.${:U\$\$\$\$\$\$\$\$}} != "dollars" . error .endif all: - @:; Index: src/usr.bin/make/unit-tests/varname-empty.exp diff -u src/usr.bin/make/unit-tests/varname-empty.exp:1.6 src/usr.bin/make/unit-tests/varname-empty.exp:1.7 --- src/usr.bin/make/unit-tests/varname-empty.exp:1.6 Wed Feb 3 08:34:15 2021 +++ src/usr.bin/make/unit-tests/varname-empty.exp Wed Feb 3 08:40:47 2021 @@ -20,7 +20,7 @@ Global:delete .INCLUDEDFROMDIR (not foun Global:delete .INCLUDEDFROMFILE (not found) Var_Set("", "default", ...) name expands to empty string - ignored Var_Set("", "assigned", ...) name expands to empty string - ignored -Var_Set("", "appended", ...) name expands to empty string - ignored +SetVar: variable name is empty - ignored Var_Set("", "", ...) name expands to empty string - ignored Var_Set("", "subst", ...) name expands to empty string - ignored Var_Set("", "shell-output", ...) name expands to empty string - ignored