summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-05-18 06:59:12 (GMT)
committerTakashi Iwai <tiwai@suse.de>2015-05-18 07:10:45 (GMT)
commit90a409aad45dedc41129e0ec257b41de901b8897 (patch)
tree31fd899ae39113c1c01053fcc709338d3ce99c29
parent1a5bc8d95020c5a81264146c94102baec6ab0861 (diff)
downloadlinux-90a409aad45dedc41129e0ec257b41de901b8897.tar.xz
ALSA: info: Fix leaks of child entries at snd_info_free_entry()
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>
-rw-r--r--sound/core/info.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sound/core/info.c b/sound/core/info.c
index c8a413d..5662793 100644
--- a/sound/core/info.c
+++ b/sound/core/info.c
@@ -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);