Commit 081f43f2 authored by Vasuki Manikarnike's avatar Vasuki Manikarnike Committed by Jim Harris
Browse files

lib/nvmf: Fix memory leak in nvmf_bdev_ctrlr_unmap



When max_discard_size_kib is set on subsystem, dsm/unmap commands are
failed back if any dsm range exceeds the maximum discard size supported.
This leaks memory allocated for unmap_ctx. Breaking out of the loop
instead of returning early fixes the memory leak.

Fixes #3539

Change-Id: I7bbb1f581e48c72947dbbbc66f5bcf1320ab69d4
Signed-off-by: default avatarVasuki Manikarnike <vasuki.manikarnike@hpe.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25042


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent daeaec81
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -715,10 +715,11 @@ nvmf_bdev_ctrlr_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
		lba = dsm_range.starting_lba;
		lba_count = dsm_range.length;
		if (max_discard_size > 0 && lba_count > (max_discard_size << 10) / block_size) {
			SPDK_ERRLOG("invalid unmap size, should not exceed %" PRIu64 "Kib\n", max_discard_size);
			SPDK_ERRLOG("invalid unmap size %" PRIu32 " blocks, should not exceed %" PRIu64 " blocks\n",
				    lba_count, max_discard_size << 1);
			response->status.sct = SPDK_NVME_SCT_GENERIC;
			response->status.sc = SPDK_NVME_SC_INVALID_FIELD;
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
			break;
		}

		unmap_ctx->count++;