Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

RDMA/rxe: Fix double free in rxe_srq_from_init

In rxe_srq_from_init(), the queue pointer 'q' is assigned to
'srq->rq.queue' before copying the SRQ number to user space.
If copy_to_user() fails, the function calls rxe_queue_cleanup()
to free the queue, but leaves the now-invalid pointer in
'srq->rq.queue'.

The caller of rxe_srq_from_init() (rxe_create_srq) eventually
calls rxe_srq_cleanup() upon receiving the error, which triggers
a second rxe_queue_cleanup() on the same memory, leading to a
double free.

The call trace looks like this:
kmem_cache_free+0x.../0x...
rxe_queue_cleanup+0x1a/0x30 [rdma_rxe]
rxe_srq_cleanup+0x42/0x60 [rdma_rxe]
rxe_elem_release+0x31/0x70 [rdma_rxe]
rxe_create_srq+0x12b/0x1a0 [rdma_rxe]
ib_create_srq_user+0x9a/0x150 [ib_core]

Fix this by moving 'srq->rq.queue = q' after copy_to_user.

Fixes: aae0484e15f0 ("IB/rxe: avoid srq memory leak")
Signed-off-by: Jiasheng Jiang <jiashengjiangcool@gmail.com>
Link: https://patch.msgid.link/20260112015412.29458-1-jiashengjiangcool@gmail.com
Reviewed-by: Zhu Yanjun <yanjun.Zhu@linux.dev>
Signed-off-by: Leon Romanovsky <leon@kernel.org>

authored by

Jiasheng Jiang and committed by
Leon Romanovsky
0beefd0e 354e7a6d

+3 -3
+3 -3
drivers/infiniband/sw/rxe/rxe_srq.c
··· 77 77 goto err_free; 78 78 } 79 79 80 - srq->rq.queue = q; 81 - init->attr.max_wr = srq->rq.max_wr; 82 - 83 80 if (uresp) { 84 81 if (copy_to_user(&uresp->srq_num, &srq->srq_num, 85 82 sizeof(uresp->srq_num))) { ··· 84 87 return -EFAULT; 85 88 } 86 89 } 90 + 91 + srq->rq.queue = q; 92 + init->attr.max_wr = srq->rq.max_wr; 87 93 88 94 return 0; 89 95