[hackers] [dmenu][PATCH] fix leak when getline fails

From: NRK <nrk_AT_disroot.org>
Date: Mon, 31 Oct 2022 00:10:45 +0600

according to the getline(3) documentation, the calling code needs to
free the buffer even if getline fails.

dmenu currently doesn't do that which results in a small leak in case of
failure (e.g when piped /dev/null)

        $ ./dmenu < /dev/null
        ==8201==ERROR: LeakSanitizer: detected memory leaks
        Direct leak of 120 byte(s) in 1 object(s) allocated from:
            #0 0x7f6bf5785ef7 in malloc
            #1 0x7f6bf538ec84 in __getdelim
            #2 0x405d0c in readstdin dmenu.c:557

moving `line = NULL` inside the loop body wasn't strictly necessary, but
IMO it makes it more apparent that `line` is getting cleared to NULL
after each successful iteration.
---
 dmenu.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/dmenu.c b/dmenu.c
index e7be8af..e786d7a 100644
--- a/dmenu.c
+++ b/dmenu.c
_AT_@ -554,7 +554,7 @@ readstdin(void)
 	ssize_t len;
 
 	/* read each line from stdin and add it to the item list */
-	for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
+	for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++) {
 		if (i + 1 >= size / sizeof *items)
 			if (!(items = realloc(items, (size += BUFSIZ))))
 				die("cannot realloc %zu bytes:", size);
_AT_@ -562,7 +562,9 @@ readstdin(void)
 			line[len - 1] = '\0';
 		items[i].text = line;
 		items[i].out = 0;
+		line = NULL;
 	}
+	free(line);
 	if (items)
 		items[i].text = NULL;
 	lines = MIN(lines, i);
-- 
2.35.1
Received on Sun Oct 30 2022 - 19:10:45 CET

This archive was generated by hypermail 2.3.0 : Sun Oct 30 2022 - 19:12:37 CET