mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 16:53:20 -04:00
RDMA/core: Fix potential use after free in uverbs_free_dmah()
When accessing a dmah via the netlink path the only synchronization
mechanism for the said dmah is rdma_restrack_get().
Currently, rdma_restrack_del() is invoked at the end of
uverbs_free_dmah(), which is too late, since by that point
vendor-specific resources associated with the dmah might already be
freed. This can leave a short window where the dmah remains accessible
through restrack, leading to a potential use-after-free.
Fix this by moving the rdma_restrack_begin_del() call to the start of
uverbs_free_dmah(), ensuring that the dmah is removed from restrack
before its internal resources are released. This guarantees that no new
users hold references to a dmah that is in the process of destruction.
In addition, this change preserves the intended inverted order
between create and destroy routines: resources are added to
restrack at the end of successful creation, and hence shall be removed
from the restrack first thing during the destruction flow, which keeps
the lifecycle management consistent and predictable.
Fixes: d83edab562 ("RDMA/core: Introduce a DMAH object and its alloc/free APIs")
Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
Link: https://patch.msgid.link/20260713-restrack-uaf-fix-resub-v2-7-bbe8bb270d51@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
committed by
Leon Romanovsky
parent
29dc2f8e1c
commit
2696626a0b
@@ -18,11 +18,14 @@ static int uverbs_free_dmah(struct ib_uobject *uobject,
|
||||
if (atomic_read(&dmah->usecnt))
|
||||
return -EBUSY;
|
||||
|
||||
rdma_restrack_begin_del(&dmah->res);
|
||||
ret = dmah->device->ops.dealloc_dmah(dmah, attrs);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
rdma_restrack_abort_del(&dmah->res);
|
||||
return ret;
|
||||
}
|
||||
|
||||
rdma_restrack_del(&dmah->res);
|
||||
rdma_restrack_commit_del(&dmah->res);
|
||||
kfree(dmah);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user