From 405095d84b1f3be17efb4e10d87d480bd054877f Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Sun, 28 Apr 2019 17:55:27 +0200
Subject: ifupdown: close memory leak

function                                             old     new   delta
execute_all                                           80      91     +11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 networking/ifupdown.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index 8a6efc976..5327b0979 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -1177,8 +1177,15 @@ static int doit(char *str)
 
 static int execute_all(struct interface_defn_t *ifd, const char *opt)
 {
+	/* 'opt' is always short, the longest value is "post-down".
+	 * Can use on-stack buffer instead of xasprintf'ed one.
+	 */
+	char buf[sizeof("run-parts /etc/network/if-%s.d")
+		+ sizeof("post-down")
+		/*paranoia:*/ + 8
+	];
 	int i;
-	char *buf;
+
 	for (i = 0; i < ifd->n_options; i++) {
 		if (strcmp(ifd->option[i].name, opt) == 0) {
 			if (!doit(ifd->option[i].value)) {
@@ -1192,8 +1199,7 @@ static int execute_all(struct interface_defn_t *ifd, const char *opt)
 	 * complains, and this message _is_ annoyingly visible.
 	 * Don't "fix" this (unless newer Debian does).
 	 */
-	buf = xasprintf("run-parts /etc/network/if-%s.d", opt);
-	/* heh, we don't bother free'ing it */
+	sprintf(buf, "run-parts /etc/network/if-%s.d", opt);
 	return doit(buf);
 }
 
-- 
cgit v1.2.3