media: v4l: subdev: Set sd->devnode before registering the subdev
authorSakari Ailus <sakari.ailus@linux.intel.com>
Thu, 15 Aug 2019 07:36:49 +0000 (09:36 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 2 Dec 2020 14:55:44 +0000 (15:55 +0100)
The subdev's video device node was only assigned after registering the
device node in the system. While it is unlikely that a driver needed to
use this field in handling system calls to its file handle, there remains
a slim chance the devnode field remains NULL while the driver expects to
find a video node there.

Assign the devnode field before registering the device, and assign it back
to NULL if the registration failed.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/v4l2-core/v4l2-device.c

index de4287251a896e2fe5405c166ff9fe4d231184ed..d2e58ae91f9b446253d74828f04115343372d99b 100644 (file)
@@ -218,13 +218,14 @@ int __v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev,
                vdev->ctrl_handler = sd->ctrl_handler;
                if (read_only)
                        set_bit(V4L2_FL_SUBDEV_RO_DEVNODE, &vdev->flags);
+               sd->devnode = vdev;
                err = __video_register_device(vdev, VFL_TYPE_SUBDEV, -1, 1,
                                              sd->owner);
                if (err < 0) {
+                       sd->devnode = NULL;
                        kfree(vdev);
                        goto clean_up;
                }
-               sd->devnode = vdev;
 #if defined(CONFIG_MEDIA_CONTROLLER)
                sd->entity.info.dev.major = VIDEO_MAJOR;
                sd->entity.info.dev.minor = vdev->minor;