mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	media: v4l2-dev: fix error handling in __video_register_device()
Once device_register() failed, we should call put_device() to
decrement reference count for cleanup. Or it could cause memory leak.
And move callback function v4l2_device_release() and v4l2_device_get()
before put_device().
As comment of device_register() says, 'NOTE: _Never_ directly free
@dev after calling this function, even if it returned an error! Always
use put_device() to give up the reference initialized in this function
instead.'
Found by code review.
Cc: stable@vger.kernel.org
Fixes: dc93a70cc7 ("V4L/DVB (9973): v4l2-dev: use the release callback from device instead of cdev")
Signed-off-by: Ma Ke <make24@iscas.ac.cn>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
			
			
This commit is contained in:
		
							parent
							
								
									48dbb76cef
								
							
						
					
					
						commit
						2a934fdb01
					
				
					 1 changed files with 7 additions and 7 deletions
				
			
		|  | @ -1054,25 +1054,25 @@ int __video_register_device(struct video_device *vdev, | |||
| 	vdev->dev.class = &video_class; | ||||
| 	vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); | ||||
| 	vdev->dev.parent = vdev->dev_parent; | ||||
| 	vdev->dev.release = v4l2_device_release; | ||||
| 	dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); | ||||
| 
 | ||||
| 	/* Increase v4l2_device refcount */ | ||||
| 	v4l2_device_get(vdev->v4l2_dev); | ||||
| 
 | ||||
| 	mutex_lock(&videodev_lock); | ||||
| 	ret = device_register(&vdev->dev); | ||||
| 	if (ret < 0) { | ||||
| 		mutex_unlock(&videodev_lock); | ||||
| 		pr_err("%s: device_register failed\n", __func__); | ||||
| 		goto cleanup; | ||||
| 		put_device(&vdev->dev); | ||||
| 		return ret; | ||||
| 	} | ||||
| 	/* Register the release callback that will be called when the last
 | ||||
| 	   reference to the device goes away. */ | ||||
| 	vdev->dev.release = v4l2_device_release; | ||||
| 
 | ||||
| 	if (nr != -1 && nr != vdev->num && warn_if_nr_in_use) | ||||
| 		pr_warn("%s: requested %s%d, got %s\n", __func__, | ||||
| 			name_base, nr, video_device_node_name(vdev)); | ||||
| 
 | ||||
| 	/* Increase v4l2_device refcount */ | ||||
| 	v4l2_device_get(vdev->v4l2_dev); | ||||
| 
 | ||||
| 	/* Part 5: Register the entity. */ | ||||
| 	ret = video_register_media_controller(vdev); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Ma Ke
						Ma Ke