dma_fence_get_stub() acquires an extra reference on the global stub
  fence, but this reference is never released on any execution path. The
  stub fence is filtered out inside dma_fence_unwrap_merge (already
  signaled), so the extra reference is never consumed. Both success and
  error paths fail to call dma_fence_put on the stub.

Cc: [email protected]
Fixes: 245a4a7b531c ("dma-buf: generalize dma_fence unwrap & merging v3")
Signed-off-by: WenTao Liang <[email protected]>
---
 drivers/dma-buf/st-dma-fence-unwrap.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/dma-buf/st-dma-fence-unwrap.c 
b/drivers/dma-buf/st-dma-fence-unwrap.c
index 72ca632e3981..b9ed85570211 100644
--- a/drivers/dma-buf/st-dma-fence-unwrap.c
+++ b/drivers/dma-buf/st-dma-fence-unwrap.c
@@ -483,7 +483,7 @@ static int unwrap_merge_order(void *arg)
 
 static int unwrap_merge_complex(void *arg)
 {
-       struct dma_fence *fence, *f1, *f2, *f3, *f4, *f5;
+       struct dma_fence *fence, *f1, *f2, *f3, *f4, *f5, *stub;
        struct dma_fence_unwrap iter;
        int err = -ENOMEM;
 
@@ -508,10 +508,11 @@ static int unwrap_merge_complex(void *arg)
        if (!f4)
                goto error_put_f3;
 
+       stub = dma_fence_get_stub();
        /* Signaled fences should be filtered, the two arrays merged. */
-       f5 = dma_fence_unwrap_merge(f3, f4, dma_fence_get_stub());
+       f5 = dma_fence_unwrap_merge(f3, f4, stub);
        if (!f5)
-               goto error_put_f4;
+               goto error_put_stub;
 
        err = 0;
        dma_fence_unwrap_for_each(fence, &iter, f5) {
@@ -532,8 +533,10 @@ static int unwrap_merge_complex(void *arg)
                err = -EINVAL;
        }
 
+       dma_fence_put(stub);
        dma_fence_put(f5);
-error_put_f4:
+error_put_stub:
+       dma_fence_put(stub);
        dma_fence_put(f4);
 error_put_f3:
        dma_fence_put(f3);
-- 
2.39.5 (Apple Git-154)

Reply via email to