diff options
author | Jaroslav Kysela <perex@perex.cz> | 2021-06-02 19:35:44 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2021-06-02 19:35:44 +0200 |
commit | 2fee6af9b6e157475159d284af8de1e879bb7a36 (patch) | |
tree | 501f87da1e501ca80b97d63e1fa048739599c132 | |
parent | 013ec607db9de11b682f2b85d843be062ca0d046 (diff) | |
download | alsa-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.c | 21 |
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; } |