Module Name: src
Committed By: rillig
Date: Fri Sep 25 23:18:59 UTC 2020
Modified Files:
src/usr.bin/make: main.c
Log Message:
make(1): fix undefined behavior for .MAKEFLAGS: -f file
Since at least 1993-03-21, adding other makefiles in a .MAKEFILES
dependency has invoked undefined behavior because the command line
arguments were copied directly into the global makefiles variable,
without a proper strdup. Shortly after that, the word list created by
Str_Words (formerly brk_string) was freed.
This applies to both the -f and the -v and -V options. Luckily it is an
edge case to use these options in .MAKEFLAGS at all.
The -T option had already been fixed at 2000-12-30, but not the other
options.
To generate a diff of this commit:
cvs rdiff -u -r1.344 -r1.345 src/usr.bin/make/main.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/main.c
diff -u src/usr.bin/make/main.c:1.344 src/usr.bin/make/main.c:1.345
--- src/usr.bin/make/main.c:1.344 Fri Sep 25 19:40:23 2020
+++ src/usr.bin/make/main.c Fri Sep 25 23:18:59 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.344 2020/09/25 19:40:23 rillig Exp $ */
+/* $NetBSD: main.c,v 1.345 2020/09/25 23:18:59 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.344 2020/09/25 19:40:23 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.345 2020/09/25 23:18:59 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.");
@@ -389,20 +389,13 @@ is_relpath(const char *path)
return FALSE;
}
-/*-
- * MainParseArgs --
- * Parse a given argument vector. Called from main() and from
- * Main_ParseArgLine() when the .MAKEFLAGS target is used.
- *
- * XXX: Deal with command line overriding .MAKEFLAGS in makefile
+/* Parse the given arguments. Called from main() and from
+ * Main_ParseArgLine() when the .MAKEFLAGS target is used.
*
- * Results:
- * None
+ * The arguments must be treated as read-only and will be freed after the
+ * call.
*
- * Side Effects:
- * Various global and local flags will be set depending on the flags
- * given
- */
+ * XXX: Deal with command line overriding .MAKEFLAGS in makefile */
static void
MainParseArgs(int argc, char **argv)
{
@@ -543,7 +536,7 @@ rearg:
case 'v':
if (argvalue == NULL) goto noarg;
printVars = c == 'v' ? EXPAND_VARS : COMPAT_VARS;
- Lst_Append(variables, argvalue);
+ Lst_Append(variables, bmake_strdup(argvalue));
Var_Append(MAKEFLAGS, "-V", VAR_GLOBAL);
Var_Append(MAKEFLAGS, argvalue, VAR_GLOBAL);
break;
@@ -571,7 +564,7 @@ rearg:
break;
case 'f':
if (argvalue == NULL) goto noarg;
- Lst_Append(makefiles, argvalue);
+ Lst_Append(makefiles, bmake_strdup(argvalue));
break;
case 'i':
ignoreErrors = TRUE;