On 11/30/22 21:57, Rob Clark wrote:
> From: Rob Clark <[email protected]>
> 
> drm_gem_shmem_mmap() doesn't own this reference, resulting in the GEM
> object getting prematurely freed leading to a later use-after-free.
> 
> Link: https://syzkaller.appspot.com/bug?extid=c8ae65286134dd1b800d
> Reported-by: [email protected]
> Fixes: 2194a63a818d ("drm: Add library for shmem backed GEM objects")
> Cc: [email protected]
> Signed-off-by: Rob Clark <[email protected]>
> Reviewed-by: Daniel Vetter <[email protected]>
> ---
>  drivers/gpu/drm/drm_gem_shmem_helper.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
> b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index 35138f8a375c..3b7b71391a4c 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -622,10 +622,8 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object 
> *shmem, struct vm_area_struct
>       }
>  
>       ret = drm_gem_shmem_get_pages(shmem);
> -     if (ret) {
> -             drm_gem_vm_close(vma);
> +     if (ret)
>               return ret;
> -     }
>  
>       vma->vm_flags |= VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
>       vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);

AFAICS, the dmabuf mmaping code path needs a similar fix, isn't it?

-               /* Drop the reference drm_gem_mmap_obj() acquired.*/
-               drm_gem_object_put(obj);
                vma->vm_private_data = NULL;

-               return dma_buf_mmap(obj->dma_buf, vma, 0);
+               ret = dma_buf_mmap(obj->dma_buf, vma, 0);
+
+               /* Drop the reference drm_gem_mmap_obj() acquired.*/
+               if (!ret)
+                       drm_gem_object_put(obj);
+
+               return ret;


-- 
Best regards,
Dmitry

Reply via email to