ALSA: info: Fix leaks of child entries at snd_info_free_entry()
authorTakashi Iwai <tiwai@suse.de>
Mon, 18 May 2015 06:59:12 +0000 (08:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 18 May 2015 07:10:45 +0000 (09:10 +0200)
snd_info_free_entry() releases the all children nodes as well, but due
to the wrong timing of releasing the link, the children nodes may be
disconnected but left unreleased.  This patch fixes it by moving the
link free at the right position.  Also it eases list_for_each_entry()
without _safe option in snd_info_disconnect() because it no longer
frees the children nodes there.

Fixes: c560a6797e3b ('ALSA: core: Remove child proc file elements recursively')
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/info.c

index c8a413d6cc9b537cb62b281d01ccf775b974170d..5662793746838715a4c5255569b01253a8adc6eb 100644 (file)
@@ -738,13 +738,12 @@ EXPORT_SYMBOL(snd_info_create_card_entry);
 
 static void snd_info_disconnect(struct snd_info_entry *entry)
 {
-       struct snd_info_entry *p, *n;
+       struct snd_info_entry *p;
 
        if (!entry->p)
                return;
-       list_for_each_entry_safe(p, n, &entry->children, list)
+       list_for_each_entry(p, &entry->children, list)
                snd_info_disconnect(p);
-       list_del_init(&entry->list);
        proc_remove(entry->p);
        entry->p = NULL;
 }
@@ -771,6 +770,7 @@ void snd_info_free_entry(struct snd_info_entry * entry)
        list_for_each_entry_safe(p, n, &entry->children, list)
                snd_info_free_entry(p);
 
+       list_del(&entry->list);
        kfree(entry->name);
        if (entry->private_free)
                entry->private_free(entry);