Module Name: src
Committed By: rillig
Date: Sun Apr 4 13:35:26 UTC 2021
Modified Files:
src/usr.bin/make: var.c
src/usr.bin/make/unit-tests: var-eval-short.exp var-eval-short.mk
varmod-loop-varname.exp varmod-loop-varname.mk
varmod-loop-varname.out varmod-loop-varname.rawout
varmod-loop-varname.status
Log Message:
make: disallow '$' in the variable name of the modifier ':@'
If this restriction should break any existing makefile, the author of
that makefile was probably heading for the IOMCC.
To generate a diff of this commit:
cvs rdiff -u -r1.906 -r1.907 src/usr.bin/make/var.c
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/var-eval-short.exp
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/var-eval-short.mk
cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/varmod-loop-varname.exp \
src/usr.bin/make/unit-tests/varmod-loop-varname.mk \
src/usr.bin/make/unit-tests/varmod-loop-varname.out \
src/usr.bin/make/unit-tests/varmod-loop-varname.rawout \
src/usr.bin/make/unit-tests/varmod-loop-varname.status
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.906 src/usr.bin/make/var.c:1.907
--- src/usr.bin/make/var.c:1.906 Sun Apr 4 11:56:43 2021
+++ src/usr.bin/make/var.c Sun Apr 4 13:35:25 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.906 2021/04/04 11:56:43 rillig Exp $ */
+/* $NetBSD: var.c,v 1.907 2021/04/04 13:35:25 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.906 2021/04/04 11:56:43 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.907 2021/04/04 13:35:25 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -1741,9 +1741,7 @@ ModifyWord_Loop(const char *word, SepBuf
return;
args = data;
- /* XXX: The variable name should not be expanded here. */
- Var_SetExpandWithFlags(args->scope, args->tvar, word,
- VAR_SET_NO_EXPORT);
+ Var_SetWithFlags(args->scope, args->tvar, word, VAR_SET_NO_EXPORT);
(void)Var_Subst(args->str, args->scope, args->emode, &s);
/* TODO: handle errors */
@@ -2475,7 +2473,7 @@ ApplyModifier_Loop(const char **pp, ModC
res = ParseModifierPart(pp, '@', VARE_PARSE_ONLY, ch, &args.tvar);
if (res != VPR_OK)
return AMR_CLEANUP;
- if (opts.strict && strchr(args.tvar, '$') != NULL) {
+ if (strchr(args.tvar, '$') != NULL) {
Parse_Error(PARSE_FATAL,
"In the :@ modifier of \"%s\", the variable name \"%s\" "
"must not contain a dollar.",
@@ -2496,11 +2494,7 @@ ApplyModifier_Loop(const char **pp, ModC
ModifyWords(ch, ModifyWord_Loop, &args, ch->oneBigWord);
ch->sep = prev_sep;
/* XXX: Consider restoring the previous variable instead of deleting. */
- /*
- * XXX: The variable name should not be expanded here, see
- * ModifyWord_Loop.
- */
- Var_DeleteExpand(expr->scope, args.tvar);
+ Var_Delete(expr->scope, args.tvar);
done:
free(args.tvar);
Index: src/usr.bin/make/unit-tests/var-eval-short.exp
diff -u src/usr.bin/make/unit-tests/var-eval-short.exp:1.10 src/usr.bin/make/unit-tests/var-eval-short.exp:1.11
--- src/usr.bin/make/unit-tests/var-eval-short.exp:1.10 Sun Apr 4 10:13:09 2021
+++ src/usr.bin/make/unit-tests/var-eval-short.exp Sun Apr 4 13:35:26 2021
@@ -1,14 +1,16 @@
-make: "var-eval-short.mk" line 77: Invalid time value: ${FAIL}}
-make: "var-eval-short.mk" line 77: Malformed conditional (0 && ${:Uword:gmtime=${FAIL}})
-make: "var-eval-short.mk" line 91: Invalid time value: ${FAIL}}
-make: "var-eval-short.mk" line 91: Malformed conditional (0 && ${:Uword:localtime=${FAIL}})
+make: "var-eval-short.mk" line 41: In the :@ modifier of "", the variable name "${FAIL}" must not contain a dollar.
+make: "var-eval-short.mk" line 41: Malformed conditional (0 && ${:Uword:@${FAIL}@expr@})
+make: "var-eval-short.mk" line 79: Invalid time value: ${FAIL}}
+make: "var-eval-short.mk" line 79: Malformed conditional (0 && ${:Uword:gmtime=${FAIL}})
+make: "var-eval-short.mk" line 93: Invalid time value: ${FAIL}}
+make: "var-eval-short.mk" line 93: Malformed conditional (0 && ${:Uword:localtime=${FAIL}})
CondParser_Eval: 0 && ${0:?${FAIL}then:${FAIL}else}
Var_Parse: ${0:?${FAIL}then:${FAIL}else} (parse-only)
Applying ${0:?...} to "" (parse-only, undefined)
Modifier part: "${FAIL}then"
Modifier part: "${FAIL}else"
Result of ${0:?${FAIL}then:${FAIL}else} is "" (parse-only, defined)
-ParseReadLine (156): 'DEFINED= defined'
+ParseReadLine (158): 'DEFINED= defined'
Global:DEFINED = defined
CondParser_Eval: 0 && ${DEFINED:L:?${FAIL}then:${FAIL}else}
Var_Parse: ${DEFINED:L:?${FAIL}then:${FAIL}else} (parse-only)
@@ -18,7 +20,7 @@ Applying ${DEFINED:?...} to "defined" (p
Modifier part: "${FAIL}then"
Modifier part: "${FAIL}else"
Result of ${DEFINED:?${FAIL}then:${FAIL}else} is "defined" (parse-only, regular)
-ParseReadLine (159): '.MAKEFLAGS: -d0'
+ParseReadLine (161): '.MAKEFLAGS: -d0'
ParseDependency(.MAKEFLAGS: -d0)
Global:.MAKEFLAGS = -r -k -d cpv -d
Global:.MAKEFLAGS = -r -k -d cpv -d 0
Index: src/usr.bin/make/unit-tests/var-eval-short.mk
diff -u src/usr.bin/make/unit-tests/var-eval-short.mk:1.4 src/usr.bin/make/unit-tests/var-eval-short.mk:1.5
--- src/usr.bin/make/unit-tests/var-eval-short.mk:1.4 Sun Mar 14 20:41:39 2021
+++ src/usr.bin/make/unit-tests/var-eval-short.mk Sun Apr 4 13:35:26 2021
@@ -1,4 +1,4 @@
-# $NetBSD: var-eval-short.mk,v 1.4 2021/03/14 20:41:39 rillig Exp $
+# $NetBSD: var-eval-short.mk,v 1.5 2021/04/04 13:35:26 rillig Exp $
#
# Tests for each variable modifier to ensure that they only do the minimum
# necessary computations. If the result of the expression is not needed, they
@@ -34,8 +34,10 @@ FAIL= ${:!echo unexpected 1>&2!}
.if 0 && ${0:?${FAIL}:${FAIL}}
.endif
-# Before var.c,v 1.870 from 2021-03-14, the expression ${FAIL} was evaluated
+# Before var.c 1.870 from 2021-03-14, the expression ${FAIL} was evaluated
# after the loop, when undefining the temporary global loop variable.
+# Since var.c 1.907 from 2021-04-04, a '$' is no longer allowed in the
+# variable name.
.if 0 && ${:Uword:@${FAIL}@expr@}
.endif
Index: src/usr.bin/make/unit-tests/varmod-loop-varname.exp
diff -u src/usr.bin/make/unit-tests/varmod-loop-varname.exp:1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.exp:1.2
--- src/usr.bin/make/unit-tests/varmod-loop-varname.exp:1.1 Sun Apr 4 13:20:52 2021
+++ src/usr.bin/make/unit-tests/varmod-loop-varname.exp Sun Apr 4 13:35:26 2021
@@ -1 +1,11 @@
-exit status 0
+make: "varmod-loop-varname.mk" line 13: In the :@ modifier of "", the variable name "${:Ubar:S,b,v,}" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 13: Malformed conditional (${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+")
+make: "varmod-loop-varname.mk" line 80: In the :@ modifier of "1 2 3", the variable name "v$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 80: Malformed conditional (${1 2 3:L:@v$@($v)@} != "(1) (2) (3)")
+make: "varmod-loop-varname.mk" line 85: In the :@ modifier of "1 2 3", the variable name "v$$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 85: Malformed conditional (${1 2 3:L:@v$$@($v)@} != "() () ()")
+make: "varmod-loop-varname.mk" line 90: In the :@ modifier of "1 2 3", the variable name "v$$$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 90: Malformed conditional (${1 2 3:L:@v$$$@($v)@} != "() () ()")
+make: Fatal errors encountered -- cannot continue
+make: stopped in unit-tests
+exit status 1
Index: src/usr.bin/make/unit-tests/varmod-loop-varname.mk
diff -u src/usr.bin/make/unit-tests/varmod-loop-varname.mk:1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.mk:1.2
--- src/usr.bin/make/unit-tests/varmod-loop-varname.mk:1.1 Sun Apr 4 13:20:52 2021
+++ src/usr.bin/make/unit-tests/varmod-loop-varname.mk Sun Apr 4 13:35:26 2021
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-loop-varname.mk,v 1.1 2021/04/04 13:20:52 rillig Exp $
+# $NetBSD: varmod-loop-varname.mk,v 1.2 2021/04/04 13:35:26 rillig Exp $
#
# Tests for the first part of the variable modifier ':@var@...@', which
# contains the variable name to use during the loop.
@@ -6,10 +6,10 @@
.MAKE.SAVE_DOLLARS= yes
-# In the :@ modifier, the name of the loop variable can be generated
-# dynamically. There's no practical use-case for this, and hopefully nobody
-# will ever depend on this, but technically it's possible.
-# Therefore, in -dL mode, this is forbidden, see lint.mk.
+# Before 2021-04-04, the name of the loop variable could be generated
+# dynamically. There was no practical use-case for this.
+# Since var.c 1.907 from 2021-04-04, a '$' is no longer allowed in the
+# variable name.
.if ${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+"
. error
.endif
@@ -75,14 +75,22 @@ RES3= 3
# Until 2020-07-20, the variable name of the :@ modifier could end with one
# or two dollar signs, which were silently ignored.
# There's no point in allowing a dollar sign in that position.
+# Since var.c 1.907 from 2021-04-04, a '$' is no longer allowed in the
+# variable name.
.if ${1 2 3:L:@v$@($v)@} != "(1) (2) (3)"
. error
+.else
+. error
.endif
.if ${1 2 3:L:@v$$@($v)@} != "() () ()"
. error
+.else
+. error
.endif
.if ${1 2 3:L:@v$$$@($v)@} != "() () ()"
. error
+.else
+. error
.endif
Index: src/usr.bin/make/unit-tests/varmod-loop-varname.out
diff -u src/usr.bin/make/unit-tests/varmod-loop-varname.out:1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.out:1.2
--- src/usr.bin/make/unit-tests/varmod-loop-varname.out:1.1 Sun Apr 4 13:20:52 2021
+++ src/usr.bin/make/unit-tests/varmod-loop-varname.out Sun Apr 4 13:35:26 2021
@@ -1 +1,11 @@
-exit status 0
+make: "varmod-loop-varname.mk" line 13: In the :@ modifier of "", the variable name "${:Ubar:S,b,v,}" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 13: Malformed conditional (${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+")
+make: "varmod-loop-varname.mk" line 80: In the :@ modifier of "1 2 3", the variable name "v$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 80: Malformed conditional (${1 2 3:L:@v$@($v)@} != "(1) (2) (3)")
+make: "varmod-loop-varname.mk" line 85: In the :@ modifier of "1 2 3", the variable name "v$$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 85: Malformed conditional (${1 2 3:L:@v$$@($v)@} != "() () ()")
+make: "varmod-loop-varname.mk" line 90: In the :@ modifier of "1 2 3", the variable name "v$$$" must not contain a dollar.
+make: "varmod-loop-varname.mk" line 90: Malformed conditional (${1 2 3:L:@v$$$@($v)@} != "() () ()")
+make: Fatal errors encountered -- cannot continue
+make: stopped in unit-tests
+exit status 1
Index: src/usr.bin/make/unit-tests/varmod-loop-varname.rawout
diff -u src/usr.bin/make/unit-tests/varmod-loop-varname.rawout:1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.rawout:1.2
--- src/usr.bin/make/unit-tests/varmod-loop-varname.rawout:1.1 Sun Apr 4 13:20:52 2021
+++ src/usr.bin/make/unit-tests/varmod-loop-varname.rawout Sun Apr 4 13:35:26 2021
@@ -0,0 +1,10 @@
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 13: In the :@ modifier of "", the variable name "${:Ubar:S,b,v,}" must not contain a dollar.
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 13: Malformed conditional (${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+")
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 80: In the :@ modifier of "1 2 3", the variable name "v$" must not contain a dollar.
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 80: Malformed conditional (${1 2 3:L:@v$@($v)@} != "(1) (2) (3)")
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 85: In the :@ modifier of "1 2 3", the variable name "v$$" must not contain a dollar.
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 85: Malformed conditional (${1 2 3:L:@v$$@($v)@} != "() () ()")
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 90: In the :@ modifier of "1 2 3", the variable name "v$$$" must not contain a dollar.
+make: "/home/rillig/proj/src/usr.bin/make/unit-tests/varmod-loop-varname.mk" line 90: Malformed conditional (${1 2 3:L:@v$$$@($v)@} != "() () ()")
+make: Fatal errors encountered -- cannot continue
+make: stopped in /home/rillig/proj/src/usr.bin/make/unit-tests
Index: src/usr.bin/make/unit-tests/varmod-loop-varname.status
diff -u src/usr.bin/make/unit-tests/varmod-loop-varname.status:1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.status:1.2
--- src/usr.bin/make/unit-tests/varmod-loop-varname.status:1.1 Sun Apr 4 13:20:52 2021
+++ src/usr.bin/make/unit-tests/varmod-loop-varname.status Sun Apr 4 13:35:26 2021
@@ -1 +1 @@
-0
+1