Re: [PATCH] media: v4l2-core: hold videodev_lock until dev reg, finishes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Fri, Feb 23, 2024 at 09:45:36AM +0100, Hans Verkuil wrote:
> After the new V4L2 device node was registered, some additional
> initialization was done before the device node was marked as
> 'registered'. During the time between creating the device node
> and marking it as 'registered' it was possible to open the
> device node, which would return -ENODEV since the 'registered'
> flag was not yet set.
> 
> Hold the videodev_lock mutex from just before the device node
> is registered until the 'registered' flag is set. Since v4l2_open
> will take the same lock, it will wait until this registration
> process is finished. This resolves this race condition.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx>

Thanks for the patch.

This seems worth a Fixes: tag if not cc'ing to stable.

Reviewed-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>

> ---
>  drivers/media/v4l2-core/v4l2-dev.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
> index d13954bd31fd..bae73b8c52ff 100644
> --- a/drivers/media/v4l2-core/v4l2-dev.c
> +++ b/drivers/media/v4l2-core/v4l2-dev.c
> @@ -1036,8 +1036,10 @@ int __video_register_device(struct video_device *vdev,
>  	vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
>  	vdev->dev.parent = vdev->dev_parent;
>  	dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
> +	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;
>  	}
> @@ -1057,6 +1059,7 @@ int __video_register_device(struct video_device *vdev,
> 
>  	/* Part 6: Activate this minor. The char device can now be used. */
>  	set_bit(V4L2_FL_REGISTERED, &vdev->flags);
> +	mutex_unlock(&videodev_lock);
> 
>  	return 0;
> 

-- 
Kind regards,

Sakari Ailus




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux