Module Name:    src
Committed By:   rillig
Date:           Tue Sep 22 20:19:46 UTC 2020

Modified Files:
        src/usr.bin/make: arch.c compat.c for.c job.c main.c make.c meta.c
            nonints.h parse.c suff.c var.c

Log Message:
make(1): prepare Var_Subst for proper error handling

Returning a VarParseResult instead of a string makes it possible to let
the error bubble up, until it reaches the main expression.


To generate a diff of this commit:
cvs rdiff -u -r1.117 -r1.118 src/usr.bin/make/arch.c
cvs rdiff -u -r1.147 -r1.148 src/usr.bin/make/compat.c
cvs rdiff -u -r1.84 -r1.85 src/usr.bin/make/for.c
cvs rdiff -u -r1.233 -r1.234 src/usr.bin/make/job.c
cvs rdiff -u -r1.340 -r1.341 src/usr.bin/make/main.c
cvs rdiff -u -r1.137 -r1.138 src/usr.bin/make/make.c
cvs rdiff -u -r1.116 -r1.117 src/usr.bin/make/meta.c
cvs rdiff -u -r1.125 -r1.126 src/usr.bin/make/nonints.h
cvs rdiff -u -r1.322 -r1.323 src/usr.bin/make/parse.c
cvs rdiff -u -r1.157 -r1.158 src/usr.bin/make/suff.c
cvs rdiff -u -r1.532 -r1.533 src/usr.bin/make/var.c

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/arch.c
diff -u src/usr.bin/make/arch.c:1.117 src/usr.bin/make/arch.c:1.118
--- src/usr.bin/make/arch.c:1.117	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/arch.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: arch.c,v 1.117 2020/09/22 04:05:41 rillig Exp $	*/
+/*	$NetBSD: arch.c,v 1.118 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -133,7 +133,7 @@
 #include    "config.h"
 
 /*	"@(#)arch.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: arch.c,v 1.117 2020/09/22 04:05:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: arch.c,v 1.118 2020/09/22 20:19:46 rillig Exp $");
 
 #ifdef TARGET_MACHINE
 #undef MAKE_MACHINE
@@ -247,7 +247,8 @@ Arch_ParseArchive(char **linePtr, GNodeL
 
     *cp++ = '\0';
     if (subLibName) {
-	libName = Var_Subst(libName, ctxt, VARE_UNDEFERR|VARE_WANTRES);
+	(void)Var_Subst(libName, ctxt, VARE_UNDEFERR|VARE_WANTRES, &libName);
+	/* TODO: handle errors */
     }
 
 
@@ -327,7 +328,9 @@ Arch_ParseArchive(char **linePtr, GNodeL
 	    char    *sacrifice;
 	    char    *oldMemName = memName;
 
-	    memName = Var_Subst(memName, ctxt, VARE_UNDEFERR | VARE_WANTRES);
+	    (void)Var_Subst(memName, ctxt, VARE_UNDEFERR | VARE_WANTRES,
+			    &memName);
+	    /* TODO: handle errors */
 
 	    /*
 	     * Now form an archive spec and recurse to deal with nested

Index: src/usr.bin/make/compat.c
diff -u src/usr.bin/make/compat.c:1.147 src/usr.bin/make/compat.c:1.148
--- src/usr.bin/make/compat.c:1.147	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/compat.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat.c,v 1.147 2020/09/22 04:05:41 rillig Exp $	*/
+/*	$NetBSD: compat.c,v 1.148 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -99,7 +99,7 @@
 #include    "pathnames.h"
 
 /*	"@(#)compat.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: compat.c,v 1.147 2020/09/22 04:05:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: compat.c,v 1.148 2020/09/22 20:19:46 rillig Exp $");
 
 static GNode	    *curTarg = NULL;
 static GNode	    *ENDNode;
@@ -209,7 +209,8 @@ Compat_RunCommand(char *cmdp, struct GNo
     doIt = FALSE;
 
     cmdNode = Lst_FindDatum(gn->commands, cmd);
-    cmdStart = Var_Subst(cmd, gn, VARE_WANTRES);
+    (void)Var_Subst(cmd, gn, VARE_WANTRES, &cmdStart);
+    /* TODO: handle errors */
 
     /*
      * brk_string will return an argv with a NULL in av[0], thus causing

Index: src/usr.bin/make/for.c
diff -u src/usr.bin/make/for.c:1.84 src/usr.bin/make/for.c:1.85
--- src/usr.bin/make/for.c:1.84	Mon Sep 14 20:43:44 2020
+++ src/usr.bin/make/for.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: for.c,v 1.84 2020/09/14 20:43:44 rillig Exp $	*/
+/*	$NetBSD: for.c,v 1.85 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1992, The Regents of the University of California.
@@ -60,7 +60,7 @@
 #include    "strlist.h"
 
 /*	"@(#)for.c	8.1 (Berkeley) 6/6/93"	*/
-MAKE_RCSID("$NetBSD: for.c,v 1.84 2020/09/14 20:43:44 rillig Exp $");
+MAKE_RCSID("$NetBSD: for.c,v 1.85 2020/09/22 20:19:46 rillig Exp $");
 
 typedef enum {
     FOR_SUB_ESCAPE_CHAR = 0x0001,
@@ -190,7 +190,9 @@ For_Eval(const char *line)
      * we will be substituting into ${...} or $(...).
      */
     {
-	char *items = Var_Subst(ptr, VAR_GLOBAL, VARE_WANTRES);
+	char *items;
+	(void)Var_Subst(ptr, VAR_GLOBAL, VARE_WANTRES, &items);
+	/* TODO: handle errors */
 	words = Str_Words(items, FALSE);
 	free(items);
     }

Index: src/usr.bin/make/job.c
diff -u src/usr.bin/make/job.c:1.233 src/usr.bin/make/job.c:1.234
--- src/usr.bin/make/job.c:1.233	Mon Sep 21 17:44:25 2020
+++ src/usr.bin/make/job.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.233 2020/09/21 17:44:25 rillig Exp $	*/
+/*	$NetBSD: job.c,v 1.234 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -140,7 +140,7 @@
 #include "trace.h"
 
 /*	"@(#)job.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: job.c,v 1.233 2020/09/21 17:44:25 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.234 2020/09/22 20:19:46 rillig Exp $");
 
 # define STATIC static
 
@@ -712,7 +712,9 @@ JobPrintCommand(void *cmdp, void *jobp)
 
     numCommands += 1;
 
-    cmdStart = cmd = Var_Subst(cmd, job->node, VARE_WANTRES);
+    Var_Subst(cmd, job->node, VARE_WANTRES, &cmd);
+    /* TODO: handle errors */
+    cmdStart = cmd;
 
     cmdTemplate = "%s\n";
 
@@ -902,8 +904,10 @@ JobPrintCommand(void *cmdp, void *jobp)
 static int
 JobSaveCommand(void *cmd, void *gn)
 {
-    cmd = Var_Subst((char *)cmd, (GNode *)gn, VARE_WANTRES);
-    Lst_Append(postCommands->commands, cmd);
+    char *expanded_cmd;
+    (void)Var_Subst(cmd, (GNode *)gn, VARE_WANTRES, &expanded_cmd);
+    /* TODO: handle errors */
+    Lst_Append(postCommands->commands, expanded_cmd);
     return 0;
 }
 
@@ -2209,8 +2213,9 @@ Job_SetPrefix(void)
 	Var_Set(MAKE_JOB_PREFIX, "---", VAR_GLOBAL);
     }
 
-    targPrefix = Var_Subst("${" MAKE_JOB_PREFIX "}",
-			   VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst("${" MAKE_JOB_PREFIX "}",
+		    VAR_GLOBAL, VARE_WANTRES, &targPrefix);
+    /* TODO: handle errors */
 }
 
 /* Initialize the process module. */

Index: src/usr.bin/make/main.c
diff -u src/usr.bin/make/main.c:1.340 src/usr.bin/make/main.c:1.341
--- src/usr.bin/make/main.c:1.340	Tue Sep 22 19:51:19 2020
+++ src/usr.bin/make/main.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.340 2020/09/22 19:51:19 rillig Exp $	*/
+/*	$NetBSD: main.c,v 1.341 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -126,7 +126,7 @@
 #endif
 
 /*	"@(#)main.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: main.c,v 1.340 2020/09/22 19:51:19 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.341 2020/09/22 20:19:46 rillig Exp $");
 #if defined(MAKE_NATIVE) && !defined(lint)
 __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\
  The Regents of the University of California.  All rights reserved.");
@@ -761,9 +761,11 @@ Main_SetVarObjdir(const char *var, const
 	/* expand variable substitutions */
 	xpath = path;
 	xpath_freeIt = NULL;
-	if (strchr(path, '$') != 0)
-		xpath = xpath_freeIt = Var_Subst(path, VAR_GLOBAL,
-						 VARE_WANTRES);
+	if (strchr(path, '$') != 0) {
+		(void)Var_Subst(path, VAR_GLOBAL, VARE_WANTRES, &xpath_freeIt);
+		/* TODO: handle errors */
+		xpath = xpath_freeIt;
+	}
 
 	(void)Main_SetObjdir("%s%s", xpath, suffix);
 
@@ -828,9 +830,12 @@ MakeMode(const char *mode)
 {
     char *mode_freeIt = NULL;
 
-    if (mode == NULL)
-	mode = mode_freeIt = Var_Subst("${" MAKE_MODE ":tl}",
-				       VAR_GLOBAL, VARE_WANTRES);
+    if (mode == NULL) {
+	(void)Var_Subst("${" MAKE_MODE ":tl}",
+		  VAR_GLOBAL, VARE_WANTRES, &mode_freeIt);
+	/* TODO: handle errors */
+	mode = mode_freeIt;
+    }
 
     if (mode[0] != '\0') {
 	if (strstr(mode, "compat")) {
@@ -865,10 +870,14 @@ doPrintVars(void)
 		char *p1;
 
 		if (strchr(var, '$')) {
-			value = p1 = Var_Subst(var, VAR_GLOBAL, VARE_WANTRES);
+			(void)Var_Subst(var, VAR_GLOBAL, VARE_WANTRES, &p1);
+			/* TODO: handle errors */
+			value = p1;
 		} else if (expandVars) {
 			char *expr = str_concat3("${", var, "}");
-			value = p1 = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES);
+			(void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &p1);
+			/* TODO: handle errors */
+			value = p1;
 			free(expr);
 		} else {
 			value = Var_Value(var, VAR_GLOBAL, &p1);
@@ -1331,8 +1340,9 @@ main(int argc, char **argv)
 			Fatal("%s: cannot open %s.", progname,
 			    (char *)LstNode_Datum(ln));
 	} else {
-		p1 = Var_Subst("${" MAKEFILE_PREFERENCE "}",
-			       VAR_CMD, VARE_WANTRES);
+		(void)Var_Subst("${" MAKEFILE_PREFERENCE "}",
+		    VAR_CMD, VARE_WANTRES, &p1);
+		/* TODO: handle errors */
 		(void)str2Lst_Append(makefiles, p1, NULL);
 		(void)Lst_Find(makefiles, ReadMakefileSucceeded, NULL);
 		free(p1);
@@ -1340,8 +1350,9 @@ main(int argc, char **argv)
 
 	/* In particular suppress .depend for '-r -V .OBJDIR -f /dev/null' */
 	if (!noBuiltins || !printVars) {
-	    makeDependfile = Var_Subst("${.MAKE.DEPENDFILE:T}",
-		VAR_CMD, VARE_WANTRES);
+	    (void)Var_Subst("${.MAKE.DEPENDFILE:T}",
+		VAR_CMD, VARE_WANTRES, &makeDependfile);
+	    /* TODO: handle errors */
 	    doing_depend = TRUE;
 	    (void)ReadMakefile(makeDependfile);
 	    doing_depend = FALSE;
@@ -1360,7 +1371,8 @@ main(int argc, char **argv)
 	    char *value;
 	    int n;
 
-	    value = Var_Subst("${.MAKE.JOBS}", VAR_GLOBAL, VARE_WANTRES);
+	    (void)Var_Subst("${.MAKE.JOBS}", VAR_GLOBAL, VARE_WANTRES, &value);
+	    /* TODO: handle errors */
 	    n = strtol(value, NULL, 0);
 	    if (n < 1) {
 		(void)fprintf(stderr, "%s: illegal value for .MAKE.JOBS -- must be positive integer!\n",
@@ -1411,7 +1423,8 @@ main(int argc, char **argv)
 		 */
 		static char VPATH[] = "${VPATH}";
 
-		vpath = Var_Subst(VPATH, VAR_CMD, VARE_WANTRES);
+		(void)Var_Subst(VPATH, VAR_CMD, VARE_WANTRES, &vpath);
+		/* TODO: handle errors */
 		path = vpath;
 		do {
 			/* skip to end of directory */
@@ -2005,7 +2018,8 @@ PrintOnError(GNode *gn, const char *s)
 	Lst_ForEach(gn->commands, addErrorCMD, gn);
     }
     expr = "${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'\n@}";
-    cp = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &cp);
+    /* TODO: handle errors */
     printf("%s", cp);
     free(cp);
     fflush(stdout);
@@ -2032,7 +2046,8 @@ Main_ExportMAKEFLAGS(Boolean first)
     once = FALSE;
 
     expr = "${.MAKEFLAGS} ${.MAKEOVERRIDES:O:u:@v@$v=${$v:Q}@}";
-    s = Var_Subst(expr, VAR_CMD, VARE_WANTRES);
+    (void)Var_Subst(expr, VAR_CMD, VARE_WANTRES, &s);
+    /* TODO: handle errors */
     if (s[0] != '\0') {
 #ifdef POSIX
 	setenv("MAKEFLAGS", s, 1);
@@ -2054,8 +2069,9 @@ getTmpdir(void)
 	 * Honor $TMPDIR but only if it is valid.
 	 * Ensure it ends with /.
 	 */
-	tmpdir = Var_Subst("${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL,
-			   VARE_WANTRES);
+	(void)Var_Subst("${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL,
+			VARE_WANTRES, &tmpdir);
+	/* TODO: handle errors */
 	if (stat(tmpdir, &st) < 0 || !S_ISDIR(st.st_mode)) {
 	    free(tmpdir);
 	    tmpdir = bmake_strdup(_PATH_TMP);
@@ -2145,8 +2161,12 @@ Boolean
 getBoolean(const char *name, Boolean fallback)
 {
     char *expr = str_concat3("${", name, ":U:tl}");
-    char *value = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES);
-    Boolean res = s2Boolean(value, fallback);
+    char *value;
+    Boolean res;
+
+    (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &value);
+    /* TODO: handle errors */
+    res = s2Boolean(value, fallback);
     free(value);
     free(expr);
     return res;

Index: src/usr.bin/make/make.c
diff -u src/usr.bin/make/make.c:1.137 src/usr.bin/make/make.c:1.138
--- src/usr.bin/make/make.c:1.137	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/make.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.c,v 1.137 2020/09/22 04:05:41 rillig Exp $	*/
+/*	$NetBSD: make.c,v 1.138 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -107,7 +107,7 @@
 #include    "job.h"
 
 /*	"@(#)make.c	8.1 (Berkeley) 6/6/93"	*/
-MAKE_RCSID("$NetBSD: make.c,v 1.137 2020/09/22 04:05:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: make.c,v 1.138 2020/09/22 20:19:46 rillig Exp $");
 
 static unsigned int checked = 1;/* Sequence # to detect recursion */
 static GNodeList *toBeMade;	/* The current fringe of the graph. These
@@ -486,7 +486,8 @@ Make_HandleUse(GNode *cgn, GNode *pgn)
 	} else {
 	    free(gn->name);
 	}
-	gn->name = Var_Subst(gn->uname, pgn, VARE_WANTRES);
+	(void)Var_Subst(gn->uname, pgn, VARE_WANTRES, &gn->name);
+	/* TODO: handle errors */
 	if (gn->uname && strcmp(gn->name, gn->uname) != 0) {
 	    /* See if we have a target for this node. */
 	    GNode *tgn = Targ_FindNode(gn->name, TARG_NOCREATE);

Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.116 src/usr.bin/make/meta.c:1.117
--- src/usr.bin/make/meta.c:1.116	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/meta.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.c,v 1.116 2020/09/22 04:05:41 rillig Exp $ */
+/*      $NetBSD: meta.c,v 1.117 2020/09/22 20:19:46 rillig Exp $ */
 
 /*
  * Implement 'meta' mode.
@@ -330,7 +330,8 @@ is_submake(void *cmdp, void *gnp)
     }
     cp = strchr(cmd, '$');
     if ((cp)) {
-	mp = Var_Subst(cmd, gn, VARE_WANTRES);
+	(void)Var_Subst(cmd, gn, VARE_WANTRES, &mp);
+	/* TODO: handle errors */
 	cmd = mp;
     }
     cp2 = strstr(cmd, p_make);
@@ -372,7 +373,9 @@ printCMD(void *cmdp, void *mfpp)
     char *cmd_freeIt = NULL;
 
     if (strchr(cmd, '$')) {
-	cmd = cmd_freeIt = Var_Subst(cmd, mfp->gn, VARE_WANTRES);
+	(void)Var_Subst(cmd, mfp->gn, VARE_WANTRES, &cmd_freeIt);
+	/* TODO: handle errors */
+	cmd = cmd_freeIt;
     }
     fprintf(mfp->fp, "CMD %s\n", cmd);
     free(cmd_freeIt);
@@ -485,7 +488,8 @@ meta_create(BuildMon *pbm, GNode *gn)
 	char *mp;
 
 	/* Describe the target we are building */
-	mp = Var_Subst("${" MAKE_META_PREFIX "}", gn, VARE_WANTRES);
+	(void)Var_Subst("${" MAKE_META_PREFIX "}", gn, VARE_WANTRES, &mp);
+	/* TODO: handle errors */
 	if (*mp)
 	    fprintf(stdout, "%s\n", mp);
 	free(mp);
@@ -627,8 +631,9 @@ meta_mode_init(const char *make_mode)
      * We consider ourselves master of all within ${.MAKE.META.BAILIWICK}
      */
     metaBailiwick = Lst_Init();
-    metaBailiwickStr = Var_Subst("${.MAKE.META.BAILIWICK:O:u:tA}",
-	VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst("${.MAKE.META.BAILIWICK:O:u:tA}",
+		    VAR_GLOBAL, VARE_WANTRES, &metaBailiwickStr);
+    /* TODO: handle errors */
     str2Lst_Append(metaBailiwick, metaBailiwickStr, NULL);
     /*
      * We ignore any paths that start with ${.MAKE.META.IGNORE_PATHS}
@@ -636,8 +641,9 @@ meta_mode_init(const char *make_mode)
     metaIgnorePaths = Lst_Init();
     Var_Append(MAKE_META_IGNORE_PATHS,
 	       "/dev /etc /proc /tmp /var/run /var/tmp ${TMPDIR}", VAR_GLOBAL);
-    metaIgnorePathsStr = Var_Subst("${" MAKE_META_IGNORE_PATHS ":O:u:tA}",
-				   VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst("${" MAKE_META_IGNORE_PATHS ":O:u:tA}",
+		    VAR_GLOBAL, VARE_WANTRES, &metaIgnorePathsStr);
+    /* TODO: handle errors */
     str2Lst_Append(metaIgnorePaths, metaIgnorePathsStr, NULL);
 
     /*
@@ -814,8 +820,9 @@ meta_job_output(Job *job, char *cp, cons
 	    if (!meta_prefix) {
 		char *cp2;
 
-		meta_prefix = Var_Subst("${" MAKE_META_PREFIX "}",
-					VAR_GLOBAL, VARE_WANTRES);
+		(void)Var_Subst("${" MAKE_META_PREFIX "}",
+				VAR_GLOBAL, VARE_WANTRES, &meta_prefix);
+		/* TODO: handle errors */
 		if ((cp2 = strchr(meta_prefix, '$')))
 		    meta_prefix_len = cp2 - meta_prefix;
 		else
@@ -998,7 +1005,8 @@ meta_ignore(GNode *gn, const char *p)
 
 	Var_Set(".p.", p, gn);
 	expr = "${" MAKE_META_IGNORE_PATTERNS ":@m@${.p.:M$m}@}";
-	pm = Var_Subst(expr, gn, VARE_WANTRES);
+	(void)Var_Subst(expr, gn, VARE_WANTRES, &pm);
+	/* TODO: handle errors */
 	if (*pm) {
 #ifdef DEBUG_META_MODE
 	    if (DEBUG(META))
@@ -1018,7 +1026,8 @@ meta_ignore(GNode *gn, const char *p)
 	snprintf(fname, sizeof(fname),
 		 "${%s:L:${%s:ts:}}",
 		 p, MAKE_META_IGNORE_FILTER);
-	fm = Var_Subst(fname, gn, VARE_WANTRES);
+	(void)Var_Subst(fname, gn, VARE_WANTRES, &fm);
+	/* TODO: handle errors */
 	if (*fm == '\0') {
 #ifdef DEBUG_META_MODE
 	    if (DEBUG(META))
@@ -1519,7 +1528,8 @@ meta_oodate(GNode *gn, Boolean oodate)
 			if (DEBUG(META))
 			    fprintf(debug_file, "%s: %d: cannot compare command using .OODATE\n", fname, lineno);
 		    }
-		    cmd = Var_Subst(cmd, gn, VARE_WANTRES|VARE_UNDEFERR);
+		    (void)Var_Subst(cmd, gn, VARE_WANTRES|VARE_UNDEFERR, &cmd);
+		    /* TODO: handle errors */
 
 		    if ((cp = strchr(cmd, '\n'))) {
 			int n;

Index: src/usr.bin/make/nonints.h
diff -u src/usr.bin/make/nonints.h:1.125 src/usr.bin/make/nonints.h:1.126
--- src/usr.bin/make/nonints.h:1.125	Tue Sep 22 06:06:18 2020
+++ src/usr.bin/make/nonints.h	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nonints.h,v 1.125 2020/09/22 06:06:18 rillig Exp $	*/
+/*	$NetBSD: nonints.h,v 1.126 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -267,7 +267,7 @@ Boolean Var_Exists(const char *, GNode *
 const char *Var_Value(const char *, GNode *, char **);
 VarParseResult Var_Parse(const char **, GNode *, VarEvalFlags,
 			 const char **, void **);
-char *Var_Subst(const char *, GNode *, VarEvalFlags);
+VarParseResult Var_Subst(const char *, GNode *, VarEvalFlags, char **);
 void Var_Init(void);
 void Var_End(void);
 void Var_Stats(void);

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.322 src/usr.bin/make/parse.c:1.323
--- src/usr.bin/make/parse.c:1.322	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/parse.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.322 2020/09/22 04:05:41 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.323 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -131,7 +131,7 @@
 #include "pathnames.h"
 
 /*	"@(#)parse.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: parse.c,v 1.322 2020/09/22 04:05:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.323 2020/09/22 20:19:46 rillig Exp $");
 
 /* types and constants */
 
@@ -771,7 +771,8 @@ ParseMessage(char *line)
     while (ch_isspace(*line))
 	line++;
 
-    line = Var_Subst(line, VAR_CMD, VARE_WANTRES);
+    (void)Var_Subst(line, VAR_CMD, VARE_WANTRES, &line);
+    /* TODO: handle errors */
     Parse_Error(mtype, "%s", line);
     free(line);
 
@@ -1924,7 +1925,8 @@ Parse_DoVar(char *line, GNode *ctxt)
 	    /* sanity check now */
 	    char *cp2;
 
-	    cp2 = Var_Subst(cp, ctxt, VARE_ASSIGN);
+	    (void)Var_Subst(cp, ctxt, VARE_ASSIGN, &cp2);
+	    /* TODO: handle errors */
 	    free(cp2);
 	}
     }
@@ -1954,7 +1956,8 @@ Parse_DoVar(char *line, GNode *ctxt)
 	if (!Var_Exists(line, ctxt))
 	    Var_Set(line, "", ctxt);
 
-	cp = Var_Subst(cp, ctxt, VARE_WANTRES|VARE_ASSIGN);
+	(void)Var_Subst(cp, ctxt, VARE_WANTRES|VARE_ASSIGN, &cp);
+	/* TODO: handle errors */
 	oldVars = oldOldVars;
 	freeCp = TRUE;
 
@@ -1969,7 +1972,8 @@ Parse_DoVar(char *line, GNode *ctxt)
 	     * expansion on the whole thing. The resulting string will need
 	     * freeing when we're done.
 	     */
-	    cp = Var_Subst(cp, VAR_CMD, VARE_UNDEFERR|VARE_WANTRES);
+	    (void)Var_Subst(cp, VAR_CMD, VARE_UNDEFERR|VARE_WANTRES, &cp);
+	    /* TODO: handle errors */
 	    freeCp = TRUE;
 	}
 
@@ -2266,7 +2270,8 @@ ParseDoInclude(char *line)
      * Substitute for any variables in the file name before trying to
      * find the thing.
      */
-    file = Var_Subst(file, VAR_CMD, VARE_WANTRES);
+    (void)Var_Subst(file, VAR_CMD, VARE_WANTRES, &file);
+    /* TODO: handle errors */
 
     Parse_include_file(file, endc == '>', *line == 'd', silent);
     free(file);
@@ -2492,7 +2497,8 @@ ParseTraditionalInclude(char *line)
      * Substitute for any variables in the file name before trying to
      * find the thing.
      */
-    all_files = Var_Subst(file, VAR_CMD, VARE_WANTRES);
+    (void)Var_Subst(file, VAR_CMD, VARE_WANTRES, &all_files);
+    /* TODO: handle errors */
 
     if (*file == '\0') {
 	Parse_Error(PARSE_FATAL,
@@ -2547,7 +2553,9 @@ ParseGmakeExport(char *line)
     /*
      * Expand the value before putting it in the environment.
      */
-    value = Var_Subst(value, VAR_CMD, VARE_WANTRES);
+    (void)Var_Subst(value, VAR_CMD, VARE_WANTRES, &value);
+    /* TODO: handle errors */
+
     setenv(variable, value, 1);
     free(value);
 }
@@ -3100,7 +3108,8 @@ Parse_File(const char *name, int fd)
 		VarEvalFlags eflags = DEBUG(LINT)
 				      ? VARE_WANTRES
 				      : VARE_UNDEFERR|VARE_WANTRES;
-		line = Var_Subst(line, VAR_CMD, eflags);
+		(void)Var_Subst(line, VAR_CMD, eflags, &line);
+		/* TODO: handle errors */
 	    }
 
 	    /*

Index: src/usr.bin/make/suff.c
diff -u src/usr.bin/make/suff.c:1.157 src/usr.bin/make/suff.c:1.158
--- src/usr.bin/make/suff.c:1.157	Tue Sep 22 04:05:41 2020
+++ src/usr.bin/make/suff.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: suff.c,v 1.157 2020/09/22 04:05:41 rillig Exp $	*/
+/*	$NetBSD: suff.c,v 1.158 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -126,7 +126,7 @@
 #include	  "dir.h"
 
 /*	"@(#)suff.c	8.4 (Berkeley) 3/21/94"	*/
-MAKE_RCSID("$NetBSD: suff.c,v 1.157 2020/09/22 04:05:41 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.158 2020/09/22 20:19:46 rillig Exp $");
 
 #define SUFF_DEBUG0(fmt) \
     if (!DEBUG(SUFF)) (void) 0; else fprintf(debug_file, fmt)
@@ -1272,7 +1272,8 @@ SuffExpandChildren(GNodeListNode *cln, G
     }
 
     SUFF_DEBUG1("Expanding \"%s\"...", cgn->name);
-    cp = Var_Subst(cgn->name, pgn, VARE_UNDEFERR|VARE_WANTRES);
+    (void)Var_Subst(cgn->name, pgn, VARE_UNDEFERR|VARE_WANTRES, &cp);
+    /* TODO: handle errors */
 
     {
 	GNodeList *members = Lst_Init();

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.532 src/usr.bin/make/var.c:1.533
--- src/usr.bin/make/var.c:1.532	Tue Sep 22 19:08:47 2020
+++ src/usr.bin/make/var.c	Tue Sep 22 20:19:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.532 2020/09/22 19:08:47 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.533 2020/09/22 20:19:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -121,7 +121,7 @@
 #include    "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.532 2020/09/22 19:08:47 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.533 2020/09/22 20:19:46 rillig Exp $");
 
 #define VAR_DEBUG_IF(cond, fmt, ...)	\
     if (!(DEBUG(VAR) && (cond)))	\
@@ -437,8 +437,11 @@ Var_Delete(const char *name, GNode *ctxt
     char *name_freeIt = NULL;
     Hash_Entry *he;
 
-    if (strchr(name, '$') != NULL)
-	name = name_freeIt = Var_Subst(name, VAR_GLOBAL, VARE_WANTRES);
+    if (strchr(name, '$') != NULL) {
+	(void)Var_Subst(name, VAR_GLOBAL, VARE_WANTRES, &name_freeIt);
+	/* TODO: handle errors */
+	name = name_freeIt;
+    }
     he = Hash_FindEntry(&ctxt->context, name);
     VAR_DEBUG("%s:delete %s%s\n",
 	      ctxt->name, name, he != NULL ? "" : " (not found)");
@@ -520,7 +523,8 @@ Var_Export1(const char *name, VarExportF
 	}
 
 	expr = str_concat3("${", name, "}");
-	val = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES);
+	(void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &val);
+	/* TODO: handle errors */
 	setenv(name, val, 1);
 	free(val);
 	free(expr);
@@ -573,7 +577,8 @@ Var_ExportVars(void)
 	return;
     }
 
-    val = Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES, &val);
+    /* TODO: handle errors */
     if (*val) {
 	Words words = Str_Words(val, FALSE);
 	size_t i;
@@ -614,7 +619,8 @@ Var_Export(const char *str, Boolean isEx
 	flags |= VAR_EXPORT_PARENT;
     }
 
-    val = Var_Subst(str, VAR_GLOBAL, VARE_WANTRES);
+    (void)Var_Subst(str, VAR_GLOBAL, VARE_WANTRES, &val);
+    /* TODO: handle errors */
     if (val[0] != '\0') {
 	Words words = Str_Words(val, FALSE);
 
@@ -685,8 +691,10 @@ Var_UnExport(const char *str)
 
     if (varnames == NULL) {
 	/* Using .MAKE.EXPORTED */
-	varnames = varnames_freeIt = Var_Subst("${" MAKE_EXPORTED ":O:u}",
-					       VAR_GLOBAL, VARE_WANTRES);
+	(void)Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES,
+			&varnames_freeIt);
+	/* TODO: handle errors */
+	varnames = varnames_freeIt;
     }
 
     {
@@ -716,7 +724,9 @@ Var_UnExport(const char *str)
 	     */
 	    if (varnames == str) {
 		char *expr = str_concat3("${" MAKE_EXPORTED ":N", v->name, "}");
-		char *cp = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES);
+		char *cp;
+		(void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &cp);
+		/* TODO: handle errors */
 		Var_Set(MAKE_EXPORTED, cp, VAR_GLOBAL);
 		free(cp);
 		free(expr);
@@ -746,8 +756,11 @@ Var_Set_with_flags(const char *name, con
      * here will override anything in a lower context, so there's not much
      * point in searching them all just to save a bit of memory...
      */
-    if (strchr(name, '$') != NULL)
-	name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES);
+    if (strchr(name, '$') != NULL) {
+	(void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt);
+	/* TODO: handle errors */
+	name = name_freeIt;
+    }
 
     if (name[0] == '\0') {
 	VAR_DEBUG("Var_Set(\"%s\", \"%s\", ...) "
@@ -889,7 +902,9 @@ Var_Append(const char *name, const char 
 
     if (strchr(name, '$') != NULL) {
 	const char *unexpanded_name = name;
-	name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES);
+	(void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt);
+	/* TODO: handle errors */
+	name = name_freeIt;
 	if (name[0] == '\0') {
 	    VAR_DEBUG("Var_Append(\"%s\", \"%s\", ...) "
 		      "name expands to empty string - ignored\n",
@@ -940,8 +955,11 @@ Var_Exists(const char *name, GNode *ctxt
     char *name_freeIt = NULL;
     Var *v;
 
-    if (strchr(name, '$') != NULL)
-	name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES);
+    if (strchr(name, '$') != NULL) {
+	(void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt);
+	/* TODO: handle errors */
+	name = name_freeIt;
+    }
 
     v = VarFind(name, ctxt, FIND_CMD | FIND_GLOBAL | FIND_ENV);
     free(name_freeIt);
@@ -1199,7 +1217,8 @@ ModifyWord_SYSVSubst(const char *word, S
     /* Append rhs to the buffer, substituting the first '%' with the
      * match, but only if the lhs had a '%' as well. */
 
-    rhs_expanded = Var_Subst(args->rhs, args->ctx, VARE_WANTRES);
+    (void)Var_Subst(args->rhs, args->ctx, VARE_WANTRES, &rhs_expanded);
+    /* TODO: handle errors */
 
     rhs = rhs_expanded;
     percent = strchr(rhs, '%');
@@ -1413,7 +1432,8 @@ ModifyWord_Loop(const char *word, SepBuf
 
     args = data;
     Var_Set_with_flags(args->tvar, word, args->ctx, VAR_NO_EXPORT);
-    s = Var_Subst(args->str, args->ctx, args->eflags);
+    (void)Var_Subst(args->str, args->ctx, args->eflags, &s);
+    /* TODO: handle errors */
 
     VAR_DEBUG("ModifyWord_Loop: in \"%s\", replace \"%s\" with \"%s\" "
 	      "to \"%s\"\n",
@@ -2268,7 +2288,8 @@ ApplyModifier_Match(const char **pp, App
     if (needSubst) {
 	/* pattern contains embedded '$', so use Var_Subst to expand it. */
 	char *old_pattern = pattern;
-	pattern = Var_Subst(pattern, st->ctxt, st->eflags);
+	(void)Var_Subst(pattern, st->ctxt, st->eflags, &pattern);
+	/* TODO: handle errors */
 	free(old_pattern);
     }
 
@@ -3622,7 +3643,8 @@ Var_Parse(const char **pp, GNode *ctxt, 
         VarEvalFlags nested_eflags = eflags;
         if (DEBUG(LINT))
             nested_eflags &= ~(unsigned)VARE_UNDEFERR;
-	nstr = Var_Subst(nstr, ctxt, nested_eflags);
+	(void)Var_Subst(nstr, ctxt, nested_eflags, &nstr);
+	/* TODO: handle errors */
 	*freePtr = nstr;
     }
 
@@ -3705,8 +3727,8 @@ Var_Parse(const char **pp, GNode *ctxt, 
  * Results:
  *	The resulting string.
  */
-char *
-Var_Subst(const char *str, GNode *ctxt, VarEvalFlags eflags)
+VarParseResult
+Var_Subst(const char *str, GNode *ctxt, VarEvalFlags eflags, char **out_res)
 {
     Buffer buf;			/* Buffer for forming things */
 
@@ -3783,7 +3805,8 @@ Var_Subst(const char *str, GNode *ctxt, 
 	}
     }
 
-    return Buf_DestroyCompact(&buf);
+    *out_res = Buf_DestroyCompact(&buf);
+    return VPR_OK;
 }
 
 /* Initialize the module. */

Reply via email to