summaryrefslogtreecommitdiff
path: root/include/linux/instruction_pointer.h
diff options
context:
space:
mode:
authorMichael Guralnik <michaelgur@nvidia.com>2026-04-27 14:02:35 +0300
committerJason Gunthorpe <jgg@nvidia.com>2026-04-29 22:37:12 +0300
commit1f3b337af2231b1e83c9052f771b201f5cbb9997 (patch)
tree84360d9529083d836715aa84a1118e19f37411de /include/linux/instruction_pointer.h
parent610771c62e2ac5bca851fc5a6f8af1cdd83f189a (diff)
downloadlinux-1f3b337af2231b1e83c9052f771b201f5cbb9997.tar.xz
RDMA/core: Fix rereg_mr use-after-free race
When a driver creates a new MR during rereg_user_mr, a race window exists between rdma_alloc_commit_uobject() for the new MR and the point where the code reads that MR to populate the response keys. A concurrent rereg_mr or destroy_mr could destroy the MR in this window and cause UAF in the first thread. Racing flow between two rereg_mr calls: CPU0 CPU1 ---- ---- rereg_user_mr(mr_handle) uobj_get_write(mr_handle) -> mr0 mr1 = driver→rereg() rdma_alloc_commit_uobject(mr1) // mr1 replaced mr0 and is unlocked uobj_put_destroy(mr0) rereg_user_mr(mr_handle) uobj_get_write(mr_handle) -> mr1 mr2 = driver→rereg() rdma_alloc_commit_uobject(mr2) // mr2 replaced mr1 and is unlocked uobj_put_destroy(mr1) // Destroys mr1! resp.lkey = mr1->lkey; // UAF - mr1 was freed! resp.rkey = mr1->rkey; // UAF - mr1 was freed! Fix by storing lkey/rkey in local variables before the new MR is unlocked and using the local variables to set the user response. Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr") Link: https://patch.msgid.link/r/20260427-security-bug-fixes-v3-4-4621fa52de0e@nvidia.com Signed-off-by: Michael Guralnik <michaelgur@nvidia.com> Reviewed-by: Maher Sanalla <msanalla@nvidia.com> Signed-off-by: Edward Srouji <edwards@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'include/linux/instruction_pointer.h')
0 files changed, 0 insertions, 0 deletions