freebsd-dev/contrib/bmake/unit-tests/varmod-loop-delete.mk
Simon J. Gerraty 129043849f Merge bmake-20211212
commit '2935fe8237c83c1dcb113dd5335733263e68e6fd'
2021-12-18 10:09:14 -08:00

34 lines
1.3 KiB
Makefile

# $NetBSD: varmod-loop-delete.mk,v 1.2 2021/12/05 15:51:33 rillig Exp $
#
# Tests for the variable modifier ':@', which as a side effect allows to
# delete an arbitrary variable.
# A side effect of the modifier ':@' is that the loop variable is created as
# an actual variable in the current evaluation scope (Command/Global/target),
# and at the end of the loop, this variable is deleted. Since var.c 1.204
# from 2016-02-18 and before var.c 1.963 from 2021-12-05, a variable could be
# deleted while it was in use, leading to a use-after-free bug.
#
# See Var_Parse, comment 'the value of the variable must not change'.
# Set up the variable that deletes itself when it is evaluated.
VAR= ${:U:@VAR@@} rest of the value
# In an assignment, the scope is 'Global'. Since the variable 'VAR' is
# defined in the global scope, it deletes itself.
EVAL:= ${VAR}
.if ${EVAL} != " rest of the value"
. error
.endif
VAR= ${:U:@VAR@@} rest of the value
all: .PHONY
# In the command that is associated with a target, the scope is the
# one from the target. That scope only contains a few variables like
# '.TARGET', '.ALLSRC', '.IMPSRC'. Make does not expect that these
# variables get modified from the outside.
#
# There is no variable named 'VAR' in the local scope, so nothing
# happens.
: $@: '${VAR}'