]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/vc4: hvs/v3d: Fix null dereference in unbind
authorGregor Herburger <gregor.herburger@linutronix.de>
Tue, 21 Jul 2026 15:38:19 +0000 (17:38 +0200)
committerMaíra Canal <mcanal@igalia.com>
Wed, 22 Jul 2026 14:29:29 +0000 (11:29 -0300)
The hvs and v3d drivers use dev_get_drvdata(master) in their unbind
functions. Since the vc4-drm gets removed before its dependent drivers
(vc4_hvs/vc4_v3d) the vc4_hvs_unbind/vc4_v3d_unbind functions try to
get drvdata of its master and fails with a null dereference error.

Use the data pointer passed to the unbind functions directly instead of
dev_get_drvdata(master). This avoids using potentially freed memory.

Fixes: d3f5168a0810 ("drm/vc4: Bind and initialize the V3D engine.")
Fixes: c8b75bca92cb ("drm/vc4: Add KMS support for Raspberry Pi.")
Signed-off-by: Gregor Herburger <gregor.herburger@linutronix.de>
Link: https://patch.msgid.link/20260721-rpi-vc4-fix-v2-1-b813dcd01dc7@linutronix.de
Reviewed-by: Maíra Canal <mcanal@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
drivers/gpu/drm/vc4/vc4_hvs.c
drivers/gpu/drm/vc4/vc4_v3d.c

index 184d51ea3fa57abf59c315c53cb43a8ba2ff0ead..e715147d091cafe15e5366d42a7d31136703b3d2 100644 (file)
@@ -1752,7 +1752,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
 static void vc4_hvs_unbind(struct device *dev, struct device *master,
                           void *data)
 {
-       struct drm_device *drm = dev_get_drvdata(master);
+       struct drm_device *drm = data;
        struct vc4_dev *vc4 = to_vc4_dev(drm);
        struct vc4_hvs *hvs = vc4->hvs;
        struct drm_mm_node *node, *next;
index d31b906cb8e787517ba3ff72c236ffcf810522b1..f32410420d3e4d947e17170dcff0a2c505bfc489 100644 (file)
@@ -494,7 +494,7 @@ err_put_runtime_pm:
 static void vc4_v3d_unbind(struct device *dev, struct device *master,
                           void *data)
 {
-       struct drm_device *drm = dev_get_drvdata(master);
+       struct drm_device *drm = data;
        struct vc4_dev *vc4 = to_vc4_dev(drm);
 
        vc4_irq_uninstall(drm);