Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3702b082 authored by Mark Hills's avatar Mark Hills Committed by Takashi Iwai
Browse files

ALSA: snd-usb-caiaq: Missing lock around use of buffer positions



Fix a race which causes snd_pcm_update_hw_ptr_pos() to report a bug.

Signed-off-by: default avatarMark Hills <mark@pogo.org.uk>
Acked-by: default avatarDaniel Mack <daniel@caiaq.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e8e0929d
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -269,16 +269,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
{
	int index = sub->number;
	struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
	snd_pcm_uframes_t ptr;

	spin_lock(&dev->spinlock);

	if (dev->input_panic || dev->output_panic)
		return SNDRV_PCM_POS_XRUN;
		ptr = SNDRV_PCM_POS_XRUN;

	if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
		return bytes_to_frames(sub->runtime,
		ptr = bytes_to_frames(sub->runtime,
					dev->audio_out_buf_pos[index]);
	else
		return bytes_to_frames(sub->runtime,
		ptr = bytes_to_frames(sub->runtime,
					dev->audio_in_buf_pos[index]);

	spin_unlock(&dev->spinlock);
	return ptr;
}

/* operators for both playback and capture */