From 6b206e31109f8ec593db82b50231b7286be0b89a Mon Sep 17 00:00:00 2001 From: John Levon Date: Sun, 8 Jan 2023 00:21:21 +0000 Subject: [PATCH] nvmf: sanity check passthru handlers These routines can only handle a single buffer; double check that is the case, and fail if not. Signed-off-by: John Levon Change-Id: I136482c27c73655887c49405f747b8ed073f7b69 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16198 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- lib/nvmf/ctrlr_bdev.c | 18 ++++++++++++++++-- .../unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index 3a48709f2..27cb28d7d 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -743,7 +743,14 @@ nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc * { int rc; - rc = spdk_bdev_nvme_io_passthru(desc, ch, &req->cmd->nvme_cmd, req->data, req->length, + if (spdk_unlikely(req->iovcnt != 1)) { + req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; + req->rsp->nvme_cpl.status.dnr = 1; + return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; + } + + rc = spdk_bdev_nvme_io_passthru(desc, ch, &req->cmd->nvme_cmd, req->iov[0].iov_base, req->length, nvmf_bdev_ctrlr_complete_cmd, req); if (spdk_unlikely(rc)) { if (rc == -ENOMEM) { @@ -766,9 +773,16 @@ spdk_nvmf_bdev_ctrlr_nvme_passthru_admin(struct spdk_bdev *bdev, struct spdk_bde { int rc; + if (spdk_unlikely(req->iovcnt != 1)) { + req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; + req->rsp->nvme_cpl.status.dnr = 1; + return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; + } + req->cmd_cb_fn = cb_fn; - rc = spdk_bdev_nvme_admin_passthru(desc, ch, &req->cmd->nvme_cmd, req->data, req->length, + rc = spdk_bdev_nvme_admin_passthru(desc, ch, &req->cmd->nvme_cmd, req->iov[0].iov_base, req->length, nvmf_bdev_ctrlr_complete_admin_cmd, req); if (spdk_unlikely(rc)) { if (rc == -ENOMEM) { diff --git a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c index 57811a885..b157e58c4 100644 --- a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c +++ b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c @@ -840,6 +840,7 @@ test_nvmf_bdev_ctrlr_nvme_passthru(void) req.qpair = &qpair; req.cmd = (union nvmf_h2c_msg *)&cmd; req.rsp = &rsp; + spdk_iov_one(req.iov, &req.iovcnt, NULL, 0); cmd.nsid = 1; cmd.opc = 0xFF;