]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dma-fence: Make dma_fence_dedup_array() robust against 0-count input
authorBaineng Shou <shoubaineng@gmail.com>
Mon, 29 Jun 2026 03:13:46 +0000 (11:13 +0800)
committerChristian König <christian.koenig@amd.com>
Mon, 29 Jun 2026 11:35:46 +0000 (13:35 +0200)
dma_fence_dedup_array() returns 1 when called with num_fences == 0:
the for-loop body never executes, j stays at 0, and the final
`return ++j` yields 1. This contradicts both the kernel-doc ("Return:
Number of unique fences remaining in the array") and the natural
expectation that 0 input gives 0 output.

The caller __dma_fence_unwrap_merge() bails out via the
`if (count == 0 || count == 1)` fast path and so is save.

But amdgpu_userq_wait_*() could reach the dedup call with a zero local
count and dereference an uninitialized fence slot in the array.

Make the contract match the documentation by returning 0 early. This
also skips an unnecessary sort() call on an empty array.

Cc: stable@vger.kernel.org
Signed-off-by: Baineng Shou <shoubaineng@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Fixes: 575ec9b0c2f1 ("dma-fence: Add helper to sort and deduplicate dma_fence arrays")
Signed-off-by: Christian König <christian.koenig@amd.com>
Link: https://lore.kernel.org/r/20260629031346.3875683-1-shoubaineng@gmail.com
drivers/dma-buf/dma-fence-unwrap.c

index 07fe9bf45aea702280f5353f79fa29b5aacff6e6..cc11c036f2b1d99613afb408077d859f65f8773e 100644 (file)
@@ -97,6 +97,9 @@ int dma_fence_dedup_array(struct dma_fence **fences, int num_fences)
 {
        int i, j;
 
+       if (!num_fences)
+               return 0;
+
        sort(fences, num_fences, sizeof(*fences), fence_cmp, NULL);
 
        /*