Module Name:    src
Committed By:   rillig
Date:           Sun Dec 10 14:30:51 UTC 2023

Modified Files:
        src/usr.bin/make: var.c
        src/usr.bin/make/unit-tests: varmod-subst-regex.mk

Log Message:
make: fix crash in ':C' modifier on an empty expression

Since var.c 1.982 from 2021-12-13.


To generate a diff of this commit:
cvs rdiff -u -r1.1076 -r1.1077 src/usr.bin/make/var.c
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/varmod-subst-regex.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.1076 src/usr.bin/make/var.c:1.1077
--- src/usr.bin/make/var.c:1.1076	Sat Dec  9 00:13:38 2023
+++ src/usr.bin/make/var.c	Sun Dec 10 14:30:50 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1076 2023/12/09 00:13:38 sjg Exp $	*/
+/*	$NetBSD: var.c,v 1.1077 2023/12/10 14:30:50 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -139,7 +139,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1076 2023/12/09 00:13:38 sjg Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1077 2023/12/10 14:30:50 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -1002,7 +1002,7 @@ Var_SetWithFlags(GNode *scope, const cha
 			 * If requested, don't export these in the
 			 * environment individually.  We still put
 			 * them in .MAKEOVERRIDES so that the
-			 * command-line settings continue to override 
+			 * command-line settings continue to override
 			 * Makefile settings.
 			 */
 			if (!opts.varNoExportEnv)
@@ -1629,7 +1629,7 @@ ok:
 	wp += (size_t)m[0].rm_eo;
 	if (args->pflags.subGlobal) {
 		flags |= REG_NOTBOL;
-		if (m[0].rm_so == 0 && m[0].rm_eo == 0) {
+		if (m[0].rm_so == 0 && m[0].rm_eo == 0 && *wp != '\0') {
 			SepBuf_AddBytes(buf, wp, 1);
 			wp++;
 		}

Index: src/usr.bin/make/unit-tests/varmod-subst-regex.mk
diff -u src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.8 src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.9
--- src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.8	Sun Nov 19 21:47:52 2023
+++ src/usr.bin/make/unit-tests/varmod-subst-regex.mk	Sun Dec 10 14:30:51 2023
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-subst-regex.mk,v 1.8 2023/11/19 21:47:52 rillig Exp $
+# $NetBSD: varmod-subst-regex.mk,v 1.9 2023/12/10 14:30:51 rillig Exp $
 #
 # Tests for the :C,from,to, variable modifier.
 
@@ -84,6 +84,31 @@ all: unmatched-subexpression
 .  error
 .endif
 
+
+# Contrary to the ':S' modifier, the ':C' modifier matches on an expression
+# that contains no words at all, but only if the regular expression matches an
+# empty string, for example, when the regular expression is anchored at the
+# beginning or the end.
+.if "<${U:S,^,prefix,}> <${:U:C,^,prefix,}>" != "<> <prefix>"
+.  error
+.endif
+.if "<${U:S,$,suffix,}> <${:U:C,$,suffix,}>" != "<> <suffix>"
+.  error
+.endif
+.if "<${U:S,^$,whole,}> <${:U:C,^$,whole,}>" != "<> <whole>"
+.  error
+.endif
+.if "<${U:S,^,prefix,g}> <${:U:C,^,prefix,g}>" != "<> <prefix>"
+.  error
+.endif
+.if "<${U:S,$,suffix,g}> <${:U:C,$,suffix,g}>" != "<> <suffix>"
+.  error
+.endif
+.if "<${U:S,^$,whole,g}> <${:U:C,^$,whole,g}>" != "<> <whole>"
+.  error
+.endif
+
+
 # Multiple asterisks form an invalid regular expression.  This produces an
 # error message and (as of 2020-08-28) stops parsing in the middle of the
 # expression.  The unparsed part of the expression is then copied

Reply via email to