FAILED: patch "[PATCH] drm/prime: Fix use after free in mmap with drm_gem_ttm_mmap" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8244a3bc27b3efd057da154b8d7e414670d5044f Mon Sep 17 00:00:00 2001
From: Anand K Mistry <[email protected]>
Date: Thu, 30 Sep 2021 09:00:07 +1000
Subject: [PATCH] drm/prime: Fix use after free in mmap with drm_gem_ttm_mmap
drm_gem_ttm_mmap() drops a reference to the gem object on success. If the gem object's refcount == 1 on entry to drm_gem_prime_mmap(), that drop will free the gem object, and the subsequent drm_gem_object_get() will be a UAF. Fix by grabbing a reference before calling the mmap helper.
This issue was forseen when the reference dropping was adding in commit 9786b65bc61ac ("drm/ttm: fix mmap refcounting"):
"For that to work properly the drm_gem_object_get() call in drm_gem_ttm_mmap() must be moved so it happens before calling obj->funcs->mmap(), otherwise the gem refcount would go down to zero."
drivers/gpu/drm/drm_prime.c +4 -2
@@ -719,11 +719,13 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)if (obj->funcs && obj->funcs->mmap) { vma->vm_ops = obj->funcs->vm_ops; +drm_gem_object_get (obj); ret = obj->funcs->mmap (obj, vma); -if (ret) +if (ret) { +drm_gem_object_put (obj);return ret; + } vma->vm_private_data = obj; -drm_gem_object_get (obj);return 0 ; }