We need to cleanup if the chain = dma_fence_chain_alloc() allocation fails. Now that we have multiple error returns in this function, switch to using an unwind ladder for cleanup.
Fixes: c2d3a7300695 ("drm/syncobj: Extend EXPORT_SYNC_FILE for timeline syncobjs") Signed-off-by: Dan Carpenter <dan.carpen...@linaro.org> --- drivers/gpu/drm/drm_syncobj.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 636cd83ca29e..c136d0c772dc 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -745,21 +745,24 @@ 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; if (!fence) return -EINVAL; syncobj = drm_syncobj_find(file_private, handle); if (!syncobj) { - dma_fence_put(fence); - return -ENOENT; + ret = -ENOENT; + goto err_put_fence; } if (point) { struct dma_fence_chain *chain = dma_fence_chain_alloc(); - if (!chain) - return -ENOMEM; + if (!chain) { + ret = -ENOMEM; + goto err_put_syncobj; + } drm_syncobj_add_point(syncobj, chain, fence, point); } else { @@ -769,6 +772,13 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private, dma_fence_put(fence); drm_syncobj_put(syncobj); return 0; + +err_put_syncobj: + drm_syncobj_put(syncobj); +err_put_fence: + dma_fence_put(fence); + + return ret; } static int drm_syncobj_export_sync_file(struct drm_file *file_private, -- 2.47.2