forked from mirrors/linux
		
	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: Mark Hills <mark@pogo.org.uk> Acked-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									e8e0929d72
								
							
						
					
					
						commit
						3702b08228
					
				
					 1 changed files with 9 additions and 3 deletions
				
			
		| 
						 | 
					@ -269,16 +269,22 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int index = sub->number;
 | 
						int index = sub->number;
 | 
				
			||||||
	struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
 | 
						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)
 | 
						if (dev->input_panic || dev->output_panic)
 | 
				
			||||||
		return SNDRV_PCM_POS_XRUN;
 | 
							ptr = SNDRV_PCM_POS_XRUN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
 | 
						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]);
 | 
										dev->audio_out_buf_pos[index]);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return bytes_to_frames(sub->runtime,
 | 
							ptr = bytes_to_frames(sub->runtime,
 | 
				
			||||||
					dev->audio_in_buf_pos[index]);
 | 
										dev->audio_in_buf_pos[index]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spin_unlock(&dev->spinlock);
 | 
				
			||||||
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* operators for both playback and capture */
 | 
					/* operators for both playback and capture */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue