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

Ismael Luceno ismael at iodev.co.uk
Mon Aug 22 17:02:41 CEST 2016


On 22/Ago/2016 11:26, Takashi Iwai wrote:
> 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.

If so, shouldn't the first call to shmget succeed?

To me it seems very unlikely that both calls continuosly fail.

> Also, which call does give a negative shmid, actually?  It's from the
> first shmget() or the second shmget()?

What happens is that both threads go down that path but, of course,
only one succeeds in the second shmget call.


More information about the Alsa-devel mailing list