mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
drm/exynos: vidi: fix to avoid directly dereferencing user pointer
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>
This commit is contained in:
parent
d3968a0d85
commit
d4c98c077c
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user