]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: i2c: ov5647: Initialize subdev before controls
authorJai Luthra <jai.luthra@ideasonboard.com>
Mon, 22 Dec 2025 08:15:25 +0000 (13:45 +0530)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Wed, 14 Jan 2026 22:33:02 +0000 (23:33 +0100)
In ov5647_init_controls() we call v4l2_get_subdevdata, but it is
initialized by v4l2_i2c_subdev_init() in the probe, which currently
happens after init_controls(). This can result in a segfault if the
error condition is hit, and we try to access i2c_client, so fix the
order.

Fixes: 4974c2f19fd8 ("media: ov5647: Support gain, exposure and AWB controls")
Cc: stable@vger.kernel.org
Suggested-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Jai Luthra <jai.luthra@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/i2c/ov5647.c

index e193fef4fcedf4661564c032cd7dbd80a9fd30a6..f9fac858dc7ba754bdbebe1792f6fb0358781408 100644 (file)
@@ -1420,15 +1420,15 @@ static int ov5647_probe(struct i2c_client *client)
 
        sensor->mode = OV5647_DEFAULT_MODE;
 
-       ret = ov5647_init_controls(sensor);
-       if (ret)
-               goto mutex_destroy;
-
        sd = &sensor->sd;
        v4l2_i2c_subdev_init(sd, client, &ov5647_subdev_ops);
        sd->internal_ops = &ov5647_subdev_internal_ops;
        sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 
+       ret = ov5647_init_controls(sensor);
+       if (ret)
+               goto mutex_destroy;
+
        sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
        sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
        ret = media_entity_pads_init(&sd->entity, 1, &sensor->pad);