Bump to 689d9bf.

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.

Ref.
https://git.suckless.org/dmenu/commit/689d9bfcf6859e5ce85c296ff0f23b5c08b1fedc.html
This commit is contained in:
bakkeby 2023-04-07 14:12:49 +02:00
parent f739d8c3a5
commit be4a165539

View File

@ -1440,7 +1440,7 @@ readstdin(void)
#endif // PASSWORD_PATCH
/* 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);
@ -1482,7 +1482,9 @@ readstdin(void)
#if HIGHPRIORITY_PATCH
items[i].hp = arrayhas(hpitems, hplength, items[i].text);
#endif // HIGHPRIORITY_PATCH
line = NULL;
}
free(line);
if (items)
items[i].text = NULL;
lines = MIN(lines, i);