mirror of git://git.suckless.org/dmenu
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.
This commit is contained in:
parent
e42c036634
commit
689d9bfcf6
4
dmenu.c
4
dmenu.c
|
@ -554,7 +554,7 @@ readstdin(void)
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
/* read each line from stdin and add it to the item list */
|
/* 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 (i + 1 >= size / sizeof *items)
|
||||||
if (!(items = realloc(items, (size += BUFSIZ))))
|
if (!(items = realloc(items, (size += BUFSIZ))))
|
||||||
die("cannot realloc %zu bytes:", size);
|
die("cannot realloc %zu bytes:", size);
|
||||||
|
@ -562,7 +562,9 @@ readstdin(void)
|
||||||
line[len - 1] = '\0';
|
line[len - 1] = '\0';
|
||||||
items[i].text = line;
|
items[i].text = line;
|
||||||
items[i].out = 0;
|
items[i].out = 0;
|
||||||
|
line = NULL;
|
||||||
}
|
}
|
||||||
|
free(line);
|
||||||
if (items)
|
if (items)
|
||||||
items[i].text = NULL;
|
items[i].text = NULL;
|
||||||
lines = MIN(lines, i);
|
lines = MIN(lines, i);
|
||||||
|
|
Loading…
Reference in New Issue