diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-04-21 14:29:00 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-04-21 14:29:00 +0200 |
commit | 312a13ef97d04f7b47ce387b76401701d28e806c (patch) | |
tree | aac084c72f51bab8286e7271ddcd23ce0c7c8169 | |
parent | d011aa5eec603b5e7b6f3d66f968e315abb2571d (diff) | |
download | salsa-lib-312a13ef97d04f7b47ce387b76401701d28e806c.tar.gz |
mixer: Make sure snd_mixer_attach_hctl() releases hctl at error
... also fix the double free in snd_mixer_attach() error path.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | src/mixer.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/mixer.c b/src/mixer.c index 9d66337..a89e3df 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -58,29 +58,27 @@ int snd_mixer_attach(snd_mixer_t *mixer, const char *name) err = snd_hctl_open(&hctl, name, 0); if (err < 0) return err; - err = snd_mixer_attach_hctl(mixer, hctl); - if (err < 0) { - snd_hctl_close(hctl); - return err; - } - return 0; + return snd_mixer_attach_hctl(mixer, hctl); } int snd_mixer_attach_hctl(snd_mixer_t *mixer, snd_hctl_t *hctl) { int err; - if (mixer->hctl) - return -EBUSY; - err = snd_hctl_nonblock(hctl, 1); - if (err < 0) { - snd_hctl_close(hctl); - return err; + if (mixer->hctl) { + err = -EBUSY; + goto error; } + err = snd_hctl_nonblock(hctl, 1); + if (err < 0) + goto error; snd_hctl_set_callback(hctl, hctl_event_handler); snd_hctl_set_callback_private(hctl, mixer); mixer->hctl = hctl; return 0; + error: + snd_hctl_close(hctl); + return err; } int snd_mixer_detach(snd_mixer_t *mixer, const char *name) |