mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	ALSA: rawmidi - Fix possible race in open
The module refcount should be handled in the register_mutex to avoid possible races with module unloading. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									fec6c6fec3
								
							
						
					
					
						commit
						f9d202833d
					
				
					 1 changed files with 7 additions and 7 deletions
				
			
		|  | @ -237,15 +237,16 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, | |||
| 		rfile->input = rfile->output = NULL; | ||||
| 	mutex_lock(®ister_mutex); | ||||
| 	rmidi = snd_rawmidi_search(card, device); | ||||
| 	mutex_unlock(®ister_mutex); | ||||
| 	if (rmidi == NULL) { | ||||
| 		err = -ENODEV; | ||||
| 		goto __error1; | ||||
| 		mutex_unlock(®ister_mutex); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 	if (!try_module_get(rmidi->card->module)) { | ||||
| 		err = -EFAULT; | ||||
| 		goto __error1; | ||||
| 		mutex_unlock(®ister_mutex); | ||||
| 		return -ENXIO; | ||||
| 	} | ||||
| 	mutex_unlock(®ister_mutex); | ||||
| 
 | ||||
| 	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) | ||||
| 		mutex_lock(&rmidi->open_mutex); | ||||
| 	if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { | ||||
|  | @ -370,10 +371,9 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, | |||
| 		snd_rawmidi_runtime_free(sinput); | ||||
| 	if (output != NULL) | ||||
| 		snd_rawmidi_runtime_free(soutput); | ||||
| 	module_put(rmidi->card->module); | ||||
| 	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) | ||||
| 		mutex_unlock(&rmidi->open_mutex); | ||||
|       __error1: | ||||
| 	module_put(rmidi->card->module); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Takashi Iwai
						Takashi Iwai