If the call to func->dirty_alloc() fails in vmw_resource_do_validate(),
the function returns without releasing the resource created by
func->create() (or the previously existing resource), leaking the
dev_priv->num_fifo_resources reference counter. This counter tracks
active FIFO resources and must be balanced by calling func->destroy()
on failure.

The existing error path for binding failures already jumps to the
out_bind_failed label which calls func->destroy(). Extend this
handling to the dirty_alloc() failure case.

Fix the leak by jumping to out_bind_failed when dirty_alloc() fails.

Cc: [email protected]
Fixes: b7468b15d271 ("drm/vmwgfx: Implement an infrastructure for 
write-coherent resources")
Signed-off-by: Wentao Liang <[email protected]>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index 388011696941..93a5835e485a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -402,7 +402,7 @@ static int vmw_resource_do_validate(struct vmw_resource 
*res,
                if (res->guest_memory_bo->dirty && !res->dirty) {
                        ret = func->dirty_alloc(res);
                        if (ret)
-                               return ret;
+                               goto out_bind_failed;
                } else if (!res->guest_memory_bo->dirty && res->dirty) {
                        func->dirty_free(res);
                }
-- 
2.34.1

Reply via email to