[alsa-devel] [PATCH] pcm: Fix shm initialization race-condition

Takashi Iwai tiwai at suse.de
Mon Aug 22 11:26:35 CEST 2016


On Sun, 14 Aug 2016 02:28:52 +0200,
Ismael Luceno wrote:
> 
> Easily seen when two threads try at the same time, one of them will fail.
> 
> The bug was identified by using apulse with Skype.
> 
> Fixes: dec428c35221 ("pcm: fix 'unable to create IPC shm instance' caused by fork from a thread")
> Fixes: https://github.com/i-rinat/apulse/issues/38
> Signed-off-by: Ismael Luceno <ismael at iodev.co.uk>
> ---
>  src/pcm/pcm_direct.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
> index c3925cc20fd3..b5215ba35406 100644
> --- a/src/pcm/pcm_direct.c
> +++ b/src/pcm/pcm_direct.c
> @@ -101,6 +101,8 @@ retryget:
>  		if ((dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t),
>  					     IPC_CREAT | IPC_EXCL | dmix->ipc_perm)) != -1)
>  			first_instance = 1;
> +		if (dmix->shmid < 0 && errno == EEXIST)
> +			goto retryget;

Hrm, but this would result in an endless loop if the shm was already
taken persistently.

Also, which call does give a negative shmid, actually?  It's from the
first shmget() or the second shmget()?
(The existing code is ugly and we need to fix the indentation
 there...)


thanks,

Takashi


More information about the Alsa-devel mailing list