From cf94fce4670cc43a805f8ab90e5f805cb57ff310 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 25 Aug 2015 15:45:57 +0200 Subject: ao_alsa: fix minor memory leak So snd_device_name_get_hint() return values do in fact have to be freed. Also, change listing semantics slightly: if io==NULL, skip the entry, instead of assuming it's an output device. --- audio/out/ao_alsa.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index d81df23f9d..b32dceb689 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -923,15 +923,18 @@ static void list_devs(struct ao *ao, struct ao_device_list *list) char *name = snd_device_name_get_hint(hints[n], "NAME"); char *desc = snd_device_name_get_hint(hints[n], "DESC"); char *io = snd_device_name_get_hint(hints[n], "IOID"); - if (io && strcmp(io, "Output") != 0) - continue; - char desc2[1024]; - snprintf(desc2, sizeof(desc2), "%s", desc ? desc : ""); - for (int i = 0; desc2[i]; i++) { - if (desc2[i] == '\n') - desc2[i] = '/'; + if (io && strcmp(io, "Output") == 0) { + char desc2[1024]; + snprintf(desc2, sizeof(desc2), "%s", desc ? desc : ""); + for (int i = 0; desc2[i]; i++) { + if (desc2[i] == '\n') + desc2[i] = '/'; + } + ao_device_list_add(list, ao, &(struct ao_device_desc){name, desc2}); } - ao_device_list_add(list, ao, &(struct ao_device_desc){name, desc2}); + free(name); + free(desc); + free(io); } snd_device_name_free_hint(hints); -- cgit v1.2.3