summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-01-23 17:59:40 +0100
committerTakashi Iwai <tiwai@suse.de>2019-01-24 14:40:26 +0100
commit3a55437141a1d287dead685b37fe240185144f15 (patch)
treed47977876513a4e0c71ca6a07d1d7de99093c9b7
parent480e32ebd524ffdf3d50cc5cac179fb9e44a552d (diff)
downloadlinux-3a55437141a1d287dead685b37fe240185144f15.tar.bz2
ALSA: proc: Avoid possible leaks of snd_info_entry objects
This patch changes the parent pointer assignment of snd_info_entry object to be always non-NULL. More specifically,check the parent argument in snd_info_create_module_entry() & co, and assign snd_proc_root if NULL is passed there. This assures that the proc object is always freed when the root is freed, so avoid possible memory leaks. For example, some error paths (e.g. snd_info_register() error at snd_minor_info_init()) may leave snd_info_entry object although the proc file itself is freed. Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/core/info.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sound/core/info.c b/sound/core/info.c
index fe502bc5e6d2..2dfb6389c084 100644
--- a/sound/core/info.c
+++ b/sound/core/info.c
@@ -741,7 +741,11 @@ struct snd_info_entry *snd_info_create_module_entry(struct module * module,
const char *name,
struct snd_info_entry *parent)
{
- struct snd_info_entry *entry = snd_info_create_entry(name, parent);
+ struct snd_info_entry *entry;
+
+ if (!parent)
+ parent = snd_proc_root;
+ entry = snd_info_create_entry(name, parent);
if (entry)
entry->module = module;
return entry;
@@ -762,7 +766,11 @@ struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
const char *name,
struct snd_info_entry * parent)
{
- struct snd_info_entry *entry = snd_info_create_entry(name, parent);
+ struct snd_info_entry *entry;
+
+ if (!parent)
+ parent = card->proc_root;
+ entry = snd_info_create_entry(name, parent);
if (entry) {
entry->module = card->module;
entry->card = card;