]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/exynos: vidi: fix to avoid directly dereferencing user pointer
authorJeongjun Park <aha310510@gmail.com>
Mon, 19 Jan 2026 08:25:52 +0000 (17:25 +0900)
committerInki Dae <inki.dae@samsung.com>
Sun, 1 Feb 2026 14:28:01 +0000 (23:28 +0900)
In vidi_connection_ioctl(), vidi->edid(user pointer) is directly
dereferenced in the kernel.

This allows arbitrary kernel memory access from the user space, so instead
of directly accessing the user pointer in the kernel, we should modify it
to copy edid to kernel memory using copy_from_user() and use it.

Cc: <stable@vger.kernel.org>
Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_vidi.c

index 480c99a8f9f7575af760bf2bd7955c21adaf218a..9709c07e5d8f481b06ab3154d7a97ef35aa95751 100644 (file)
@@ -252,13 +252,27 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
 
        if (vidi->connection) {
                const struct drm_edid *drm_edid;
-               const struct edid *raw_edid;
+               const void __user *edid_userptr = u64_to_user_ptr(vidi->edid);
+               void *edid_buf;
+               struct edid hdr;
                size_t size;
 
-               raw_edid = (const struct edid *)(unsigned long)vidi->edid;
-               size = (raw_edid->extensions + 1) * EDID_LENGTH;
+               if (copy_from_user(&hdr, edid_userptr, sizeof(hdr)))
+                       return -EFAULT;
 
-               drm_edid = drm_edid_alloc(raw_edid, size);
+               size = (hdr.extensions + 1) * EDID_LENGTH;
+
+               edid_buf = kmalloc(size, GFP_KERNEL);
+               if (!edid_buf)
+                       return -ENOMEM;
+
+               if (copy_from_user(edid_buf, edid_userptr, size)) {
+                       kfree(edid_buf);
+                       return -EFAULT;
+               }
+
+               drm_edid = drm_edid_alloc(edid_buf, size);
+               kfree(edid_buf);
                if (!drm_edid)
                        return -ENOMEM;