Previously, if dma_fence_chain_alloc() failed, the syncobj and fence
would be leaked.

Signed-off-by: Julian Orth <[email protected]>
---
 drivers/gpu/drm/drm_syncobj.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 9b7ecc2978f5..1da96e23dfc0 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -767,30 +767,35 @@ static int drm_syncobj_import_sync_file_fence(struct 
drm_file *file_private,
 {
        struct dma_fence *fence = sync_file_get_fence(fd);
        struct drm_syncobj *syncobj;
+       int ret = 0;
 
        if (!fence)
                return -EINVAL;
 
        syncobj = drm_syncobj_find(file_private, handle);
        if (!syncobj) {
-               dma_fence_put(fence);
-               return -ENOENT;
+               ret = -ENOENT;
+               goto err_syncobj;
        }
 
        if (point) {
                struct dma_fence_chain *chain = dma_fence_chain_alloc();
 
-               if (!chain)
-                       return -ENOMEM;
+               if (!chain) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
 
                drm_syncobj_add_point(syncobj, chain, fence, point);
        } else {
                drm_syncobj_replace_fence(syncobj, fence);
        }
 
-       dma_fence_put(fence);
+err:
        drm_syncobj_put(syncobj);
-       return 0;
+err_syncobj:
+       dma_fence_put(fence);
+       return ret;
 }
 
 static int drm_syncobj_export_sync_file(struct drm_file *file_private,

-- 
2.54.0

Reply via email to