aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-04-21 14:29:00 +0200
committerTakashi Iwai <tiwai@suse.de>2015-04-21 14:29:00 +0200
commit312a13ef97d04f7b47ce387b76401701d28e806c (patch)
treeaac084c72f51bab8286e7271ddcd23ce0c7c8169
parentd011aa5eec603b5e7b6f3d66f968e315abb2571d (diff)
downloadsalsa-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.c22
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)