summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2022-10-31 00:10:45 +0600
committerRafael Marçalo <raroma09@gmail.com>2022-11-01 15:06:33 +0000
commit5cab1030790feede7052f650eee8ee90ed0a9e7e (patch)
treea083a6cf5fa6cbcb4332489e314c9dd38cda232c
parent043a456627fdd9d9da4d74edb77f5b19be28c9cb (diff)
fix leak when getline fails
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.
-rw-r--r--dmenu.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/dmenu.c b/dmenu.c
index df21ba1..51e940c 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -565,7 +565,7 @@ readstdin(void)
}
/* 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);
@@ -573,7 +573,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);