Skip to content

Commit 2a934fd

Browse files
Ma Kehverkuil
authored andcommitted
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: dc93a70 ("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>
1 parent 48dbb76 commit 2a934fd

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

drivers/media/v4l2-core/v4l2-dev.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,25 +1054,25 @@ int __video_register_device(struct video_device *vdev,
10541054
vdev->dev.class = &video_class;
10551055
vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
10561056
vdev->dev.parent = vdev->dev_parent;
1057+
vdev->dev.release = v4l2_device_release;
10571058
dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
1059+
1060+
/* Increase v4l2_device refcount */
1061+
v4l2_device_get(vdev->v4l2_dev);
1062+
10581063
mutex_lock(&videodev_lock);
10591064
ret = device_register(&vdev->dev);
10601065
if (ret < 0) {
10611066
mutex_unlock(&videodev_lock);
10621067
pr_err("%s: device_register failed\n", __func__);
1063-
goto cleanup;
1068+
put_device(&vdev->dev);
1069+
return ret;
10641070
}
1065-
/* Register the release callback that will be called when the last
1066-
reference to the device goes away. */
1067-
vdev->dev.release = v4l2_device_release;
10681071

10691072
if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
10701073
pr_warn("%s: requested %s%d, got %s\n", __func__,
10711074
name_base, nr, video_device_node_name(vdev));
10721075

1073-
/* Increase v4l2_device refcount */
1074-
v4l2_device_get(vdev->v4l2_dev);
1075-
10761076
/* Part 5: Register the entity. */
10771077
ret = video_register_media_controller(vdev);
10781078

0 commit comments

Comments
 (0)