From afb3f73869b633ab1fbcbafbad3736718862eca3 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Mon, 28 Aug 2017 13:02:12 -0700 Subject: [PATCH] nvmf: always zero admin ctrlr-to-host data buffers For admin commands with controller to host transfers, make sure no uninitialized data is returned to the host. This allows us to remove a few other memset()s in per-command handlers. Change-Id: I00ef42945a118b6e7a0b68ab21c59fdcd21d0ee2 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/376024 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/nvmf/ctrlr.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index e9f640b1b..6f69fcc05 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -799,8 +799,6 @@ spdk_nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req) return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } - memset(req->data, 0, req->length); - offset = (uint64_t)cmd->cdw12 | ((uint64_t)cmd->cdw13 << 32); if (offset & 3) { SPDK_ERRLOG("Invalid log page offset 0x%" PRIx64 "\n", offset); @@ -980,10 +978,6 @@ spdk_nvmf_ctrlr_identify(struct spdk_nvmf_request *req) struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; struct spdk_nvmf_subsystem *subsystem = ctrlr->subsys; - if (req->data) { - memset(req->data, 0, req->length); - } - if (req->data == NULL || req->length < 4096) { SPDK_ERRLOG("identify command with invalid buffer\n"); rsp->status.sct = SPDK_NVME_SCT_GENERIC; @@ -1136,6 +1130,10 @@ spdk_nvmf_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req) struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl; + if (req->data && spdk_nvme_opc_get_data_transfer(cmd->opc) == SPDK_NVME_DATA_CONTROLLER_TO_HOST) { + memset(req->data, 0, req->length); + } + if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) { /* Discovery controllers only support Get Log Page and Identify */ switch (cmd->opc) {