]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/panthor: Fix UAF on kernel BO VA nodes
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 31 Oct 2025 15:48:15 +0000 (16:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 13:02:49 +0000 (14:02 +0100)
[ Upstream commit 98dd5143447af0ee33551776d8b2560c35d0bc4a ]

If the MMU is down, panthor_vm_unmap_range() might return an error.
We expect the page table to be updated still, and if the MMU is blocked,
the rest of the GPU should be blocked too, so no risk of accessing
physical memory returned to the system (which the current code doesn't
cover for anyway).

Proceed with the rest of the cleanup instead of bailing out and leaving
the va_node inserted in the drm_mm, which leads to UAF when other
adjacent nodes are removed from the drm_mm tree.

Reported-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Closes: https://gitlab.freedesktop.org/panfrost/linux/-/issues/57
Fixes: 8a1cc07578bf ("drm/panthor: Add GEM logical block")
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Link: https://patch.msgid.link/20251031154818.821054-2-boris.brezillon@collabora.com
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/panthor/panthor_gem.c

index 3f43686f0195886ff3fe231fd38636e0d0af098a..14ed09d700f2f7e35d7ec5fd445ac4f3989242b8 100644 (file)
@@ -86,7 +86,6 @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
 void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
 {
        struct panthor_vm *vm;
-       int ret;
 
        if (IS_ERR_OR_NULL(bo))
                return;
@@ -94,18 +93,11 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
        vm = bo->vm;
        panthor_kernel_bo_vunmap(bo);
 
-       if (drm_WARN_ON(bo->obj->dev,
-                       to_panthor_bo(bo->obj)->exclusive_vm_root_gem != panthor_vm_root_gem(vm)))
-               goto out_free_bo;
-
-       ret = panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size);
-       if (ret)
-               goto out_free_bo;
-
+       drm_WARN_ON(bo->obj->dev,
+                   to_panthor_bo(bo->obj)->exclusive_vm_root_gem != panthor_vm_root_gem(vm));
+       panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size);
        panthor_vm_free_va(vm, &bo->va_node);
        drm_gem_object_put(bo->obj);
-
-out_free_bo:
        panthor_vm_put(vm);
        kfree(bo);
 }