Module Name:    src
Committed By:   rillig
Date:           Sat May 25 00:00:25 UTC 2024

Modified Files:
        src/usr.bin/make: cond.c dir.c for.c make.c make.h parse.c targ.c
            test-variants.mk var.c

Log Message:
make: fix a few more memory leaks


To generate a diff of this commit:
cvs rdiff -u -r1.363 -r1.364 src/usr.bin/make/cond.c
cvs rdiff -u -r1.291 -r1.292 src/usr.bin/make/dir.c
cvs rdiff -u -r1.179 -r1.180 src/usr.bin/make/for.c
cvs rdiff -u -r1.262 -r1.263 src/usr.bin/make/make.c
cvs rdiff -u -r1.333 -r1.334 src/usr.bin/make/make.h
cvs rdiff -u -r1.723 -r1.724 src/usr.bin/make/parse.c
cvs rdiff -u -r1.181 -r1.182 src/usr.bin/make/targ.c
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/test-variants.mk
cvs rdiff -u -r1.1110 -r1.1111 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/cond.c
diff -u src/usr.bin/make/cond.c:1.363 src/usr.bin/make/cond.c:1.364
--- src/usr.bin/make/cond.c:1.363	Tue Apr 23 22:51:28 2024
+++ src/usr.bin/make/cond.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: cond.c,v 1.363 2024/04/23 22:51:28 rillig Exp $	*/
+/*	$NetBSD: cond.c,v 1.364 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -91,7 +91,7 @@
 #include "dir.h"
 
 /*	"@(#)cond.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: cond.c,v 1.363 2024/04/23 22:51:28 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.364 2024/05/25 00:00:25 rillig Exp $");
 
 /*
  * Conditional expressions conform to this grammar:
@@ -736,8 +736,10 @@ CondParser_ComparisonOrLeaf(CondParser *
 	arg = ParseWord(&p, doEval);
 	assert(arg[0] != '\0');
 
-	if (*p == '=' || *p == '!' || *p == '<' || *p == '>')
+	if (*p == '=' || *p == '!' || *p == '<' || *p == '>') {
+		free(arg);
 		return CondParser_Comparison(par, doEval);
+	}
 	par->p = p;
 
 	/*

Index: src/usr.bin/make/dir.c
diff -u src/usr.bin/make/dir.c:1.291 src/usr.bin/make/dir.c:1.292
--- src/usr.bin/make/dir.c:1.291	Fri May 24 22:52:24 2024
+++ src/usr.bin/make/dir.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: dir.c,v 1.291 2024/05/24 22:52:24 rillig Exp $	*/
+/*	$NetBSD: dir.c,v 1.292 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -132,7 +132,7 @@
 #include "job.h"
 
 /*	"@(#)dir.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: dir.c,v 1.291 2024/05/24 22:52:24 rillig Exp $");
+MAKE_RCSID("$NetBSD: dir.c,v 1.292 2024/05/25 00:00:25 rillig Exp $");
 
 /*
  * A search path is a list of CachedDir structures. A CachedDir has in it the
@@ -501,6 +501,18 @@ Dir_InitDot(void)
 	Dir_SetPATH();		/* initialize */
 }
 
+#ifdef CLEANUP
+static void
+FreeCachedTable(HashTable *tbl)
+{
+	HashIter hi;
+	HashIter_Init(&hi, tbl);
+	while (HashIter_Next(&hi) != NULL)
+		free(hi.entry->value);
+	HashTable_Done(tbl);
+}
+#endif
+
 /* Clean up the directories module. */
 void
 Dir_End(void)
@@ -511,8 +523,8 @@ Dir_End(void)
 	CachedDir_Assign(&dotLast, NULL);
 	SearchPath_Clear(&dirSearchPath);
 	OpenDirs_Done(&openDirs);
-	HashTable_Done(&mtimes);
-	HashTable_Done(&lmtimes);
+	FreeCachedTable(&mtimes);
+	FreeCachedTable(&lmtimes);
 #endif
 }
 

Index: src/usr.bin/make/for.c
diff -u src/usr.bin/make/for.c:1.179 src/usr.bin/make/for.c:1.180
--- src/usr.bin/make/for.c:1.179	Mon Apr  1 12:33:27 2024
+++ src/usr.bin/make/for.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: for.c,v 1.179 2024/04/01 12:33:27 rillig Exp $	*/
+/*	$NetBSD: for.c,v 1.180 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1992, The Regents of the University of California.
@@ -58,7 +58,7 @@
 #include "make.h"
 
 /*	"@(#)for.c	8.1 (Berkeley) 6/6/93"	*/
-MAKE_RCSID("$NetBSD: for.c,v 1.179 2024/04/01 12:33:27 rillig Exp $");
+MAKE_RCSID("$NetBSD: for.c,v 1.180 2024/05/25 00:00:25 rillig Exp $");
 
 
 typedef struct ForLoop {
@@ -156,7 +156,8 @@ ForLoop_ParseVarnames(ForLoop *f, const 
 		cpp_skip_whitespace(&p);
 		if (*p == '\0') {
 			Parse_Error(PARSE_FATAL, "missing `in' in for");
-			f->vars.len = 0;
+			while (f->vars.len > 0)
+				free(*(char **)Vector_Pop(&f->vars));
 			return;
 		}
 
@@ -166,7 +167,8 @@ ForLoop_ParseVarnames(ForLoop *f, const 
 				    "invalid character '%c' "
 				    "in .for loop variable name",
 				    p[len]);
-				f->vars.len = 0;
+				while (f->vars.len > 0)
+					free(*(char **)Vector_Pop(&f->vars));
 				return;
 			}
 		}

Index: src/usr.bin/make/make.c
diff -u src/usr.bin/make/make.c:1.262 src/usr.bin/make/make.c:1.263
--- src/usr.bin/make/make.c:1.262	Fri Jan  5 23:22:06 2024
+++ src/usr.bin/make/make.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.c,v 1.262 2024/01/05 23:22:06 rillig Exp $	*/
+/*	$NetBSD: make.c,v 1.263 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -104,7 +104,7 @@
 #include "job.h"
 
 /*	"@(#)make.c	8.1 (Berkeley) 6/6/93"	*/
-MAKE_RCSID("$NetBSD: make.c,v 1.262 2024/01/05 23:22:06 rillig Exp $");
+MAKE_RCSID("$NetBSD: make.c,v 1.263 2024/05/25 00:00:25 rillig Exp $");
 
 /* Sequence # to detect recursion. */
 static unsigned int checked_seqno = 1;
@@ -127,8 +127,8 @@ debug_printf(const char *fmt, ...)
 	va_end(ap);
 }
 
-static const char *
-GNodeType_ToString(GNodeType type, void **freeIt)
+static char *
+GNodeType_ToString(GNodeType type)
 {
 	Buffer buf;
 
@@ -166,11 +166,13 @@ GNodeType_ToString(GNodeType type, void 
 	ADD(OP_DEPS_FOUND);
 	ADD(OP_MARK);
 #undef ADD
-	return buf.len == 0 ? "none" : (*freeIt = Buf_DoneData(&buf));
+	if (buf.len == 0)
+		Buf_AddStr(&buf, "none");
+	return Buf_DoneData(&buf);
 }
 
-static const char *
-GNodeFlags_ToString(GNodeFlags flags, void **freeIt)
+static char *
+GNodeFlags_ToString(GNodeFlags flags)
 {
 	Buffer buf;
 
@@ -184,24 +186,22 @@ GNodeFlags_ToString(GNodeFlags flags, vo
 	Buf_AddFlag(&buf, flags.doneAllsrc, "DONE_ALLSRC");
 	Buf_AddFlag(&buf, flags.cycle, "CYCLE");
 	Buf_AddFlag(&buf, flags.doneCycle, "DONECYCLE");
-	return buf.len == 0 ? "none" : (*freeIt = Buf_DoneData(&buf));
+	if (buf.len == 0)
+		Buf_AddStr(&buf, "none");
+	return Buf_DoneData(&buf);
 }
 
 void
 GNode_FprintDetails(FILE *f, const char *prefix, const GNode *gn,
 		    const char *suffix)
 {
-	void *type_freeIt = NULL;
-	void *flags_freeIt = NULL;
+	char *type = GNodeType_ToString(gn->type);
+	char *flags = GNodeFlags_ToString(gn->flags);
 
 	fprintf(f, "%s%s, type %s, flags %s%s",
-	    prefix,
-	    GNodeMade_Name(gn->made),
-	    GNodeType_ToString(gn->type, &type_freeIt),
-	    GNodeFlags_ToString(gn->flags, &flags_freeIt),
-	    suffix);
-	free(type_freeIt);
-	free(flags_freeIt);
+	    prefix, GNodeMade_Name(gn->made), type, flags, suffix);
+	free(type);
+	free(flags);
 }
 
 bool

Index: src/usr.bin/make/make.h
diff -u src/usr.bin/make/make.h:1.333 src/usr.bin/make/make.h:1.334
--- src/usr.bin/make/make.h:1.333	Tue May  7 18:26:22 2024
+++ src/usr.bin/make/make.h	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.h,v 1.333 2024/05/07 18:26:22 sjg Exp $	*/
+/*	$NetBSD: make.h,v 1.334 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -1004,6 +1004,9 @@ typedef enum VarExportMode {
 } VarExportMode;
 
 void Var_Delete(GNode *, const char *);
+#ifdef CLEANUP
+void Var_DeleteAll(GNode *scope);
+#endif
 void Var_Undef(const char *);
 void Var_Set(GNode *, const char *, const char *);
 void Var_SetExpand(GNode *, const char *, const char *);

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.723 src/usr.bin/make/parse.c:1.724
--- src/usr.bin/make/parse.c:1.723	Sun May 19 20:09:40 2024
+++ src/usr.bin/make/parse.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.723 2024/05/19 20:09:40 sjg Exp $	*/
+/*	$NetBSD: parse.c,v 1.724 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -105,7 +105,7 @@
 #include "pathnames.h"
 
 /*	"@(#)parse.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: parse.c,v 1.723 2024/05/19 20:09:40 sjg Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.724 2024/05/25 00:00:25 rillig Exp $");
 
 /* Detects a multiple-inclusion guard in a makefile. */
 typedef enum {
@@ -1263,13 +1263,12 @@ IncludeFile(const char *file, bool isSys
 	}
 
 	if (SkipGuarded(fullname))
-		return;
+		goto done;
 
 	if ((fd = open(fullname, O_RDONLY)) == -1) {
 		if (!silent)
 			Parse_Error(PARSE_FATAL, "Cannot open %s", fullname);
-		free(fullname);
-		return;
+		goto done;
 	}
 
 	buf = LoadFile(fullname, fd);
@@ -1278,6 +1277,7 @@ IncludeFile(const char *file, bool isSys
 	Parse_PushInput(fullname, 1, 0, buf, NULL);
 	if (depinc)
 		doing_depend = depinc;	/* only turn it on */
+done:
 	free(fullname);
 }
 

Index: src/usr.bin/make/targ.c
diff -u src/usr.bin/make/targ.c:1.181 src/usr.bin/make/targ.c:1.182
--- src/usr.bin/make/targ.c:1.181	Sat Apr 27 17:33:47 2024
+++ src/usr.bin/make/targ.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: targ.c,v 1.181 2024/04/27 17:33:47 rillig Exp $	*/
+/*	$NetBSD: targ.c,v 1.182 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -107,7 +107,7 @@
 #include "dir.h"
 
 /*	"@(#)targ.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: targ.c,v 1.181 2024/04/27 17:33:47 rillig Exp $");
+MAKE_RCSID("$NetBSD: targ.c,v 1.182 2024/05/25 00:00:25 rillig Exp $");
 
 /*
  * All target nodes that appeared on the left-hand side of one of the
@@ -219,6 +219,10 @@ GNode_New(const char *name)
 static void
 GNode_Free(GNode *gn)
 {
+#ifdef CLEANUP
+	Var_DeleteAll(gn);
+#endif
+
 	free(gn->name);
 	free(gn->uname);
 	free(gn->path);
@@ -236,20 +240,6 @@ GNode_Free(GNode *gn)
 	Lst_Done(&gn->order_succ);
 	Lst_Done(&gn->cohorts);
 
-	/*
-	 * Do not free the variables themselves, even though they are owned
-	 * by this node.
-	 *
-	 * XXX: For the nodes that represent targets or sources (and not
-	 * SCOPE_GLOBAL), it should be safe to free the variables as well,
-	 * since each node manages the memory for all its variables itself.
-	 *
-	 * XXX: The GNodes that are only used as variable scopes (SCOPE_CMD,
-	 * SCOPE_GLOBAL, SCOPE_INTERNAL) are not freed at all (see Var_End,
-	 * where they are not mentioned).  These may be freed if their
-	 * variable values are indeed not used anywhere else (see Trace_Init
-	 * for the only suspicious use).
-	 */
 	HashTable_Done(&gn->vars);
 
 	/*

Index: src/usr.bin/make/test-variants.mk
diff -u src/usr.bin/make/test-variants.mk:1.7 src/usr.bin/make/test-variants.mk:1.8
--- src/usr.bin/make/test-variants.mk:1.7	Fri May 24 23:02:46 2024
+++ src/usr.bin/make/test-variants.mk	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-# $NetBSD: test-variants.mk,v 1.7 2024/05/24 23:02:46 rillig Exp $
+# $NetBSD: test-variants.mk,v 1.8 2024/05/25 00:00:25 rillig Exp $
 #
 # Build several variants of make and run the tests on them.
 #
@@ -60,6 +60,7 @@ ENV.no-meta=		USE_META="no"
 SKIP_TESTS.no-meta=	depsrc-meta meta-cmd-cmp
 
 TESTS+=			cleanup
+ENV.cleanup=		MKLINT=yes
 CPPFLAGS.cleanup=	-DCLEANUP
 
 TESTS+=			debug-refcnt

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.1110 src/usr.bin/make/var.c:1.1111
--- src/usr.bin/make/var.c:1.1110	Fri May 24 23:02:46 2024
+++ src/usr.bin/make/var.c	Sat May 25 00:00:25 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1110 2024/05/24 23:02:46 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1111 2024/05/25 00:00:25 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -132,7 +132,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1110 2024/05/24 23:02:46 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1111 2024/05/25 00:00:25 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -582,6 +582,21 @@ Var_Delete(GNode *scope, const char *var
 	free(v);
 }
 
+#ifdef CLEANUP
+void
+Var_DeleteAll(GNode *scope)
+{
+	for (;;) {
+		HashIter hi;
+		HashIter_Init(&hi, &scope->vars);
+		if (HashIter_Next(&hi) == NULL)
+			return;
+		((Var *)hi.entry->value)->readOnly = false;
+		Var_Delete(scope, hi.entry->key);
+	}
+}
+#endif
+
 /*
  * Undefine one or more variables from the global scope.
  * The argument is expanded exactly once and then split into words.
@@ -2466,6 +2481,7 @@ ApplyModifier_Defined(const char **pp, M
 	Expr_Define(expr);
 	if (shouldEval)
 		Expr_SetValue(expr, Substring_Str(LazyBuf_Get(&buf)));
+	LazyBuf_Done(&buf);
 
 	return AMR_OK;
 }
@@ -4753,32 +4769,11 @@ Var_Init(void)
 	SCOPE_CMDLINE = GNode_New("Command");
 }
 
-#ifdef CLEANUP
-static void
-Var_DeleteAll(GNode *scope)
-{
-	for (;;) {
-		HashIter hi;
-		HashIter_Init(&hi, &scope->vars);
-		if (!HashIter_Next(&hi))
-			return;
-		((Var *)hi.entry->value)->readOnly = false;
-		Var_Delete(scope, hi.entry->key);
-	}
-}
-
-#endif
-
 /* Clean up the variables module. */
 void
 Var_End(void)
 {
 	Var_Stats();
-#ifdef CLEANUP
-	Var_DeleteAll(SCOPE_CMDLINE);
-	Var_DeleteAll(SCOPE_GLOBAL);
-	Var_DeleteAll(SCOPE_INTERNAL);
-#endif
 }
 
 void

Reply via email to