media: v4l: subdev: Make link validation safer
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 24 Feb 2023 15:00:46 +0000 (16:00 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sat, 18 Mar 2023 07:48:15 +0000 (08:48 +0100)
Link validation currently accesses invalid pointers if the link passed to
it is not between two sub-devices. This is of course a driver bug.

Ignore the error but print a warning message, as this is how it used to
work previously.

Fixes: a6b995ed03ff ("media: subdev: use streams in v4l2_subdev_link_validate()")
Reported-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/v4l2-core/v4l2-subdev.c

index 03dc5f6..c7154a7 100644 (file)
@@ -1258,6 +1258,16 @@ int v4l2_subdev_link_validate(struct media_link *link)
        bool states_locked;
        int ret;
 
+       if (!is_media_entity_v4l2_subdev(link->sink->entity) ||
+           !is_media_entity_v4l2_subdev(link->source->entity)) {
+               pr_warn_once("%s of link '%s':%u->'%s':%u is not a V4L2 sub-device, driver bug!\n",
+                            !is_media_entity_v4l2_subdev(link->sink->entity) ?
+                            "sink" : "source",
+                            link->source->entity->name, link->source->index,
+                            link->sink->entity->name, link->sink->index);
+               return 0;
+       }
+
        sink_sd = media_entity_to_v4l2_subdev(link->sink->entity);
        source_sd = media_entity_to_v4l2_subdev(link->source->entity);