From f9f65ee8ce3c53596ac4cad3b33efeb708ebec9b Mon Sep 17 00:00:00 2001 From: marcel Date: Mon, 13 Jan 2003 23:53:46 +0000 Subject: Prevent infinite substitution of the empty string by forcing non- global substitution. In general it's a makefile bug to globally substitute the empty string, but it's a bug in make(1) if a bug in the makefile yields an infinite running time of make(1). Not objected to by: arch@ --- usr.bin/make/var.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'usr.bin') diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index b5b2b02..32da4e8 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -1349,6 +1349,17 @@ Var_Parse(char *str, GNode *ctxt, Boolean err, int *lengthPtr, Boolean *freePtr) cp++; } + /* + * Replacing the empty string for something else when + * done globally causes an infinite loop. The only + * meaningful substitution of the empty string would + * be those anchored by '^' or '$'. Thus, we can + * safely turn the substitution into a non-global one + * if the LHS is the empty string. + */ + if (pattern.leftLen == 0) + pattern.flags &= ~VAR_SUB_GLOBAL; + termc = *cp; newStr = VarModify(str, VarSubstitute, (void *)&pattern); -- cgit v1.1