linux/drivers/infiniband/hw
George Kennedy 437f033e30 IB/mlx5: Fix init stage error handling to avoid double free of same QP and UAF
[ Upstream commit 2ef422f063 ]

In the unlikely event that workqueue allocation fails and returns NULL in
mlx5_mkey_cache_init(), delete the call to
mlx5r_umr_resource_cleanup() (which frees the QP) in
mlx5_ib_stage_post_ib_reg_umr_init().  This will avoid attempted double
free of the same QP when __mlx5_ib_add() does its cleanup.

Resolves a splat:

   Syzkaller reported a UAF in ib_destroy_qp_user

   workqueue: Failed to create a rescuer kthread for wq "mkey_cache": -EINTR
   infiniband mlx5_0: mlx5_mkey_cache_init:981:(pid 1642):
   failed to create work queue
   infiniband mlx5_0: mlx5_ib_stage_post_ib_reg_umr_init:4075:(pid 1642):
   mr cache init failed -12
   ==================================================================
   BUG: KASAN: slab-use-after-free in ib_destroy_qp_user (drivers/infiniband/core/verbs.c:2073)
   Read of size 8 at addr ffff88810da310a8 by task repro_upstream/1642

   Call Trace:
   <TASK>
   kasan_report (mm/kasan/report.c:590)
   ib_destroy_qp_user (drivers/infiniband/core/verbs.c:2073)
   mlx5r_umr_resource_cleanup (drivers/infiniband/hw/mlx5/umr.c:198)
   __mlx5_ib_add (drivers/infiniband/hw/mlx5/main.c:4178)
   mlx5r_probe (drivers/infiniband/hw/mlx5/main.c:4402)
   ...
   </TASK>

   Allocated by task 1642:
   __kmalloc (./include/linux/kasan.h:198 mm/slab_common.c:1026
   mm/slab_common.c:1039)
   create_qp (./include/linux/slab.h:603 ./include/linux/slab.h:720
   ./include/rdma/ib_verbs.h:2795 drivers/infiniband/core/verbs.c:1209)
   ib_create_qp_kernel (drivers/infiniband/core/verbs.c:1347)
   mlx5r_umr_resource_init (drivers/infiniband/hw/mlx5/umr.c:164)
   mlx5_ib_stage_post_ib_reg_umr_init (drivers/infiniband/hw/mlx5/main.c:4070)
   __mlx5_ib_add (drivers/infiniband/hw/mlx5/main.c:4168)
   mlx5r_probe (drivers/infiniband/hw/mlx5/main.c:4402)
   ...

   Freed by task 1642:
   __kmem_cache_free (mm/slub.c:1826 mm/slub.c:3809 mm/slub.c:3822)
   ib_destroy_qp_user (drivers/infiniband/core/verbs.c:2112)
   mlx5r_umr_resource_cleanup (drivers/infiniband/hw/mlx5/umr.c:198)
   mlx5_ib_stage_post_ib_reg_umr_init (drivers/infiniband/hw/mlx5/main.c:4076
   drivers/infiniband/hw/mlx5/main.c:4065)
   __mlx5_ib_add (drivers/infiniband/hw/mlx5/main.c:4168)
   mlx5r_probe (drivers/infiniband/hw/mlx5/main.c:4402)
   ...

Fixes: 04876c12c1 ("RDMA/mlx5: Move init and cleanup of UMR to umr.c")
Link: https://lore.kernel.org/r/1698170518-4006-1-git-send-email-george.kennedy@oracle.com
Suggested-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: George Kennedy <george.kennedy@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2023-11-20 11:52:08 +01:00
..
bnxt_re RDMA/bnxt_re: Prevent handling any completions after qp destroy 2023-08-03 10:24:04 +02:00
cxgb4 RDMA/cxgb4: Check skb value for failure to allocate 2023-10-19 23:08:49 +02:00
efa RDMA/efa: Fix wrong resources deallocation order 2023-09-13 09:42:57 +02:00
erdma RDMA/erdma: Use fixed hardware page size 2023-05-11 23:03:33 +09:00
hfi1 RDMA/hfi1: Workaround truncation compilation error 2023-11-20 11:52:07 +01:00
hns RDMA/hns: The UD mode can only be configured with DCQCN 2023-11-20 11:52:06 +01:00
irdma RDMA/irdma: Prevent zero-length STAG registration 2023-09-13 09:42:56 +02:00
mlx4 IB/mlx4: Fix the size of a buffer in add_port_entries() 2023-10-10 22:00:44 +02:00
mlx5 IB/mlx5: Fix init stage error handling to avoid double free of same QP and UAF 2023-11-20 11:52:08 +01:00
mthca RDMA/mthca: Fix crash when polling CQ for shared QPs 2023-08-03 10:24:03 +02:00
ocrdma IB: move from strlcpy with unused retval to strscpy 2022-08-21 14:18:02 +03:00
qedr RDMA/qedr: clean up work queue on failure in qedr_alloc_resources() 2022-10-28 12:59:40 -03:00
qib RDMA/qib: fix repeated words in comments 2022-09-20 14:11:14 +03:00
usnic RDMA/usnic: use iommu_map_atomic() under spin_lock() 2023-02-14 19:11:43 +01:00
vmw_pvrdma RDMA/pvrdma: Remove useless DMA-32 fallback configuration 2022-01-28 10:49:04 -04:00
Makefile RDMA/erdma: Add driver to kernel build environment 2022-07-27 16:04:05 -03:00