From: Dave Airlie <[email protected]>

In the non-uvmm path, there could be a race between the info lookup
finding the vma, and the gem close path closing the vma leading
to a use-after-free.

Spotted with the help of Opus 4.6.

Signed-off-by: Dave Airlie <[email protected]>
Cc: [email protected]
---
 drivers/gpu/drm/nouveau/nouveau_gem.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 20dba02d6175b..c5a24dff4b69b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -313,11 +313,20 @@ nouveau_gem_info(struct drm_file *file_priv, struct 
drm_gem_object *gem,
        rep->offset = nvbo->offset;
        if (vmm->vmm.object.oclass >= NVIF_CLASS_VMM_NV50 &&
            !nouveau_cli_uvmm(cli)) {
+               int ret;
+
+               ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
+               if (ret)
+                       return ret;
+
                vma = nouveau_vma_find(nvbo, vmm);
-               if (!vma)
+               if (!vma) {
+                       ttm_bo_unreserve(&nvbo->bo);
                        return -EINVAL;
+               }
 
                rep->offset = vma->addr;
+               ttm_bo_unreserve(&nvbo->bo);
        } else
                rep->offset = 0;
 
-- 
2.54.0

Reply via email to