mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	media: lirc: do not call close() or open() on unregistered devices
If a lirc chardev is held open after a device is unplugged, rc_close() will be called after rc_unregister_device(). The driver is not expecting any calls at this point, and the iguanair driver causes an oops in this scenario. rc_open() can be called when the device is removed too, by calling open on the chardev whilst the device is being removed. Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
		
							parent
							
								
									7790e81f7e
								
							
						
					
					
						commit
						cb84343fce
					
				
					 1 changed files with 9 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -863,11 +863,15 @@ int rc_open(struct rc_dev *rdev)
 | 
			
		|||
 | 
			
		||||
	mutex_lock(&rdev->lock);
 | 
			
		||||
 | 
			
		||||
	if (!rdev->users++ && rdev->open != NULL)
 | 
			
		||||
		rval = rdev->open(rdev);
 | 
			
		||||
	if (!rdev->registered) {
 | 
			
		||||
		rval = -ENODEV;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (!rdev->users++ && rdev->open)
 | 
			
		||||
			rval = rdev->open(rdev);
 | 
			
		||||
 | 
			
		||||
	if (rval)
 | 
			
		||||
		rdev->users--;
 | 
			
		||||
		if (rval)
 | 
			
		||||
			rdev->users--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mutex_unlock(&rdev->lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -886,7 +890,7 @@ void rc_close(struct rc_dev *rdev)
 | 
			
		|||
	if (rdev) {
 | 
			
		||||
		mutex_lock(&rdev->lock);
 | 
			
		||||
 | 
			
		||||
		if (!--rdev->users && rdev->close != NULL)
 | 
			
		||||
		if (!--rdev->users && rdev->close && rdev->registered)
 | 
			
		||||
			rdev->close(rdev);
 | 
			
		||||
 | 
			
		||||
		mutex_unlock(&rdev->lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue