+16
−0
Loading
The following heap-use-after-free may happen when RDMA listener is removed: 1. At least 2 listeners exist, at least 1 qpair is created on each listening port 2. Listener A is removed, in nvmf_stop_listen_disconnect_qpairs we iterate all qpair (let's say A1 and B1) and we check if qpair's source trid matches listener's trid by calling nvmf_transport_qpair_get_listen_trid. Trid is retrieved from qpair->listen_id which points to the listener A cmid. Assume that qpair's A1 trid matches, A1 starts the disconnect process 3. After iterating all qpairs on step 2 we switch to the next IO channel and then complete port removal on RDMA transport layer where we destroy cmid of the listener A 4. Qpair A1 still has IO submitted to bdev, destruction is postponed 5. Listener B is removed, in nvmf_stop_listen_disconnect_qpairs we iterate all qpairs (A1 and B1) and try to check A1's listen trid. But listener A is already destroyed, so RDMA qpair->listen_id points to freed memory chunk To fix this issue, nvmf_stop_listen_disconnect_qpairs was modified to ensure that no qpairs with listen_trid == removed_trid exist before destroying the listener. Fixes issue #2948 Signed-off-by:Alexey Marchuk <alexeymar@nvidia.com> Change-Id: Iba263981ff02726f0c850bea90264118289e500c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17287 Community-CI: Mellanox Build Bot Tested-by:
SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by:
Ben Walker <benjamin.walker@intel.com> Reviewed-by:
Jim Harris <james.r.harris@intel.com>