summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2021-06-02 19:35:44 +0200
committerJaroslav Kysela <perex@perex.cz>2021-06-02 19:35:44 +0200
commit2fee6af9b6e157475159d284af8de1e879bb7a36 (patch)
tree501f87da1e501ca80b97d63e1fa048739599c132
parent013ec607db9de11b682f2b85d843be062ca0d046 (diff)
downloadalsa-lib-2fee6af9b6e157475159d284af8de1e879bb7a36.tar.gz
pcm: direct - fix pcmp error path in _snd_pcm_direct_new()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--src/pcm/pcm_direct.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
index 0e5e0421..361805bd 100644
--- a/src/pcm/pcm_direct.c
+++ b/src/pcm/pcm_direct.c
@@ -2126,24 +2126,20 @@ int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,
dmix->type = type;
ret = snd_pcm_new(pcmp, type, name, stream, mode);
- if (ret < 0) {
-_err_nosem:
- free(dmix->bindings);
- free(dmix);
- return ret;
- }
+ if (ret < 0)
+ goto _err_nosem;
while (1) {
ret = snd_pcm_direct_semaphore_create_or_connect(dmix);
if (ret < 0) {
SNDERR("unable to create IPC semaphore");
- goto _err_nosem;
+ goto _err_nosem_free;
}
ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
if (ret < 0) {
snd_pcm_direct_semaphore_discard(dmix);
if (--fail_sem_loop <= 0)
- goto _err_nosem;
+ goto _err_nosem_free;
continue;
}
break;
@@ -2153,10 +2149,17 @@ _err_nosem:
if (ret < 0) {
SNDERR("unable to create IPC shm instance");
snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
- goto _err_nosem;
+ goto _err_nosem_free;
} else {
*_dmix = dmix;
}
return ret;
+_err_nosem_free:
+ snd_pcm_free(*pcmp);
+ *pcmp = NULL;
+_err_nosem:
+ free(dmix->bindings);
+ free(dmix);
+ return ret;
}