[alsa-devel] Assertion failure in alsa-lib crashing applications (snd_pcm_area_copy: Assertion `dst < src || dst >= src + bytes' failed)

Baptiste Jonglez baptiste at bitsofnetworks.org
Fri Jul 1 12:19:08 CEST 2016


On Wed, Jun 29, 2016 at 06:02:58PM +0200, Takashi Iwai wrote:
> Now I reread the code again, and I guess it's really the racy
> accesses.  Basically you can't call alsa-lib functions concurrently.
> For example, calling snd_pcm_avail_update() from multiple threads
> concurrently may lead to such an error.  Internally it copies /
> converts the content (e.g. for softvol plugin), and this would
> conflict when called in parallel.
> 
> You can try a hackish patch below to see whether it emits any
> messages.  It has no mutex, so the code itself is racy, but it should
> be enough just as a check.
> 
> Meanwhile, the crash itself might be avoided by disabling
> "pcm->mmap_shadow = 1" line in pcm_softvol.c.  Then it'll be copied to
> the external buffer.

Thank you Takashi, I will give it a try!

Baptiste

> ---
> diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
> index 8527783c3569..571defad6e12 100644
> --- a/src/pcm/pcm_plugin.c
> +++ b/src/pcm/pcm_plugin.c
> @@ -483,17 +483,25 @@ snd_pcm_plugin_mmap_commit(snd_pcm_t *pcm,
>  
>  static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
>  {
> +	static snd_pcm_t *check = NULL;
>  	snd_pcm_plugin_t *plugin = pcm->private_data;
>  	snd_pcm_t *slave = plugin->gen.slave;
>  	snd_pcm_sframes_t slave_size;
>  	int err;
>  
> +	if (!check)
> +		check = pcm;
> +	else if (pcm == check)
> +		fprintf(stderr, "XXX RACY CALL\n");
> +
>  	slave_size = snd_pcm_avail_update(slave);
>  	if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
>  	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
>  	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED)
>  		goto _capture;
>          *pcm->hw.ptr = *slave->hw.ptr;
> +	if (pcm == check)
> +		check = NULL;
>          return slave_size;
>   _capture:
>   	{
> @@ -545,11 +553,15 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
>  			slave_size -= slave_frames;
>  			xfer += frames;
>  		}
> +		if (pcm == check)
> +			check = NULL;
>  		return (snd_pcm_sframes_t)xfer;
>  
>  	error_atomic:
>  		snd_atomic_write_end(&plugin->watom);
>  	error:
> +		if (pcm == check)
> +			check = NULL;
>  		return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
>  	}
>  }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20160701/5064fa31/attachment.sig>


More information about the Alsa-devel mailing list