fix leak when getline fails 689d9bfc
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.
NRK · 2022-10-31 00:10 1 file(s) · +3 −1
dmenu.c +3 −1
554 554
	ssize_t len;
555 555
556 556
	/* read each line from stdin and add it to the item list */
557 -
	for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
557 +
	for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++) {
558 558
		if (i + 1 >= size / sizeof *items)
559 559
			if (!(items = realloc(items, (size += BUFSIZ))))
560 560
				die("cannot realloc %zu bytes:", size);
562 562
			line[len - 1] = '\0';
563 563
		items[i].text = line;
564 564
		items[i].out = 0;
565 +
		line = NULL;
565 566
	}
567 +
	free(line);
566 568
	if (items)
567 569
		items[i].text = NULL;
568 570
	lines = MIN(lines, i);