pcm: direct - fix pcmp error path in _snd_pcm_direct_new()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2021-06-02 19:35:44 +02:00
parent 013ec607db
commit 2fee6af9b6

View file

@ -2126,24 +2126,20 @@ int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,
dmix->type = type; dmix->type = type;
ret = snd_pcm_new(pcmp, type, name, stream, mode); ret = snd_pcm_new(pcmp, type, name, stream, mode);
if (ret < 0) { if (ret < 0)
_err_nosem: goto _err_nosem;
free(dmix->bindings);
free(dmix);
return ret;
}
while (1) { while (1) {
ret = snd_pcm_direct_semaphore_create_or_connect(dmix); ret = snd_pcm_direct_semaphore_create_or_connect(dmix);
if (ret < 0) { if (ret < 0) {
SNDERR("unable to create IPC semaphore"); SNDERR("unable to create IPC semaphore");
goto _err_nosem; goto _err_nosem_free;
} }
ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT); ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
if (ret < 0) { if (ret < 0) {
snd_pcm_direct_semaphore_discard(dmix); snd_pcm_direct_semaphore_discard(dmix);
if (--fail_sem_loop <= 0) if (--fail_sem_loop <= 0)
goto _err_nosem; goto _err_nosem_free;
continue; continue;
} }
break; break;
@ -2153,10 +2149,17 @@ _err_nosem:
if (ret < 0) { if (ret < 0) {
SNDERR("unable to create IPC shm instance"); SNDERR("unable to create IPC shm instance");
snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT); snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
goto _err_nosem; goto _err_nosem_free;
} else { } else {
*_dmix = dmix; *_dmix = dmix;
} }
return ret;
_err_nosem_free:
snd_pcm_free(*pcmp);
*pcmp = NULL;
_err_nosem:
free(dmix->bindings);
free(dmix);
return ret; return ret;
} }