Commit 36d421e6 authored by Zack Rusin's avatar Zack Rusin

drm/vmwgfx: Stop accessing buffer objects which failed init

ttm_bo_init_reserved on failure puts the buffer object back which
causes it to be deleted, but kfree was still being called on the same
buffer in vmw_bo_create leading to a double free.

After the double free the vmw_gem_object_create_with_handle was
setting the gem function objects before checking the return status
of vmw_bo_create leading to null pointer access.

Fix the entire path by relaying on ttm_bo_init_reserved to delete the
buffer objects on failure and making sure the return status is checked
before setting the gem function objects on the buffer object.
Signed-off-by: default avatarZack Rusin <zackr@vmware.com>
Fixes: 8afa13a0 ("drm/vmwgfx: Implement DRIVER_GEM")
Reviewed-by: default avatarMaaz Mombasawala <mombasawalam@vmware.com>
Reviewed-by: default avatarMartin Krastev <krastevm@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230208180050.2093426-1-zack@kde.org
parent a44df74c
...@@ -416,13 +416,15 @@ int vmw_bo_create(struct vmw_private *vmw, ...@@ -416,13 +416,15 @@ int vmw_bo_create(struct vmw_private *vmw,
return -ENOMEM; return -ENOMEM;
} }
/*
* vmw_bo_init will delete the *p_bo object if it fails
*/
ret = vmw_bo_init(vmw, *p_bo, params, vmw_bo_free); ret = vmw_bo_init(vmw, *p_bo, params, vmw_bo_free);
if (unlikely(ret != 0)) if (unlikely(ret != 0))
goto out_error; goto out_error;
return ret; return ret;
out_error: out_error:
kfree(*p_bo);
*p_bo = NULL; *p_bo = NULL;
return ret; return ret;
} }
......
...@@ -127,11 +127,11 @@ int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, ...@@ -127,11 +127,11 @@ int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv,
}; };
ret = vmw_bo_create(dev_priv, &params, p_vbo); ret = vmw_bo_create(dev_priv, &params, p_vbo);
(*p_vbo)->tbo.base.funcs = &vmw_gem_object_funcs;
if (ret != 0) if (ret != 0)
goto out_no_bo; goto out_no_bo;
(*p_vbo)->tbo.base.funcs = &vmw_gem_object_funcs;
ret = drm_gem_handle_create(filp, &(*p_vbo)->tbo.base, handle); ret = drm_gem_handle_create(filp, &(*p_vbo)->tbo.base, handle);
/* drop reference from allocate - handle holds it now */ /* drop reference from allocate - handle holds it now */
drm_gem_object_put(&(*p_vbo)->tbo.base); drm_gem_object_put(&(*p_vbo)->tbo.base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment