Allocate the plane object with drmm_universal_plane_alloc() in order to
tie the release action to the underlying struct drm_device, where all
the userspace visible stuff is attached to, rather than to struct device.

This can prevent potential use-after free issues on driver unload or
EPROBE_DEFERRED backoff.

Signed-off-by: Danilo Krummrich <d...@redhat.com>
---
 drivers/gpu/drm/vc4/vc4_plane.c | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 1e866dc00ac3..0d88de31aa9c 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -1469,7 +1469,6 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
        struct vc4_plane *vc4_plane;
        u32 formats[ARRAY_SIZE(hvs_formats)];
        int num_formats = 0;
-       int ret = 0;
        unsigned i;
        static const uint64_t modifiers[] = {
                DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
@@ -1480,11 +1479,6 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
                DRM_FORMAT_MOD_INVALID
        };
 
-       vc4_plane = devm_kzalloc(dev->dev, sizeof(*vc4_plane),
-                                GFP_KERNEL);
-       if (!vc4_plane)
-               return ERR_PTR(-ENOMEM);
-
        for (i = 0; i < ARRAY_SIZE(hvs_formats); i++) {
                if (!hvs_formats[i].hvs5_only || vc4->is_vc5) {
                        formats[num_formats] = hvs_formats[i].drm;
@@ -1492,13 +1486,14 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
                }
        }
 
+       vc4_plane = drmm_universal_plane_alloc(dev, struct vc4_plane, base, 0,
+                                              &vc4_plane_funcs, formats,
+                                              num_formats, modifiers, type,
+                                              NULL);
+       if (!vc4_plane)
+               return ERR_CAST(vc4_plane);
+
        plane = &vc4_plane->base;
-       ret = drm_universal_plane_init(dev, plane, 0,
-                                      &vc4_plane_funcs,
-                                      formats, num_formats,
-                                      modifiers, type, NULL);
-       if (ret)
-               return ERR_PTR(ret);
 
        if (vc4->is_vc5)
                drm_plane_helper_add(plane, &vc5_plane_helper_funcs);
-- 
2.36.1

Reply via email to