summaryrefslogtreecommitdiff
path: root/usr.bin/make
diff options
context:
space:
mode:
authorrillig <rillig@NetBSD.org>2020-12-12 19:39:34 +0000
committerrillig <rillig@NetBSD.org>2020-12-12 19:39:34 +0000
commit011a906f89e9953db840f16461be101ebff9ffc5 (patch)
treef1a3c9bb2f0bc17ed08b4c5a2940304ef56bc64c /usr.bin/make
parentd67ddbdbbfb307bef8dfe6d77245b51b27b57193 (diff)
make(1): fix undefined behavior when exporting ${:U }
Diffstat (limited to 'usr.bin/make')
-rw-r--r--usr.bin/make/var.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index 7c585161562..35dd74f2be5 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.726 2020/12/12 19:31:17 rillig Exp $ */
+/* $NetBSD: var.c,v 1.727 2020/12/12 19:39:34 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -131,7 +131,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.726 2020/12/12 19:31:17 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.727 2020/12/12 19:39:34 rillig Exp $");
/* A string that may need to be freed after use. */
typedef struct FStr {
@@ -674,23 +674,24 @@ Var_ReexportVars(void)
static void
ExportVars(const char *varnames, Boolean isExport, VarExportFlags flags)
{
- if (varnames[0] != '\0') {
- Words words = Str_Words(varnames, FALSE);
+ Words words = Str_Words(varnames, FALSE);
+ size_t i;
- size_t i;
- for (i = 0; i < words.len; i++) {
- const char *name = words.words[i];
- if (ExportVar(name, flags)) {
- if (var_exportedVars == VAR_EXPORTED_NONE)
- var_exportedVars = VAR_EXPORTED_SOME;
- if (isExport && (flags & VAR_EXPORT_PARENT)) {
- Var_Append(MAKE_EXPORTED, name,
- VAR_GLOBAL);
- }
- }
- }
- Words_Free(words);
+ if (words.len == 1 && words.words[0][0] == '\0')
+ words.len = 0;
+
+ for (i = 0; i < words.len; i++) {
+ const char *varname = words.words[i];
+ if (!ExportVar(varname, flags))
+ continue;
+
+ if (var_exportedVars == VAR_EXPORTED_NONE)
+ var_exportedVars = VAR_EXPORTED_SOME;
+
+ if (isExport && (flags & VAR_EXPORT_PARENT))
+ Var_Append(MAKE_EXPORTED, varname, VAR_GLOBAL);
}
+ Words_Free(words);
}
/*