Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
hw/nvme: check maximum copy length (MCL) for COPY
MCL(Maximum Copy Length) in the Identify Namespace data structure limits
the number of LBAs to be copied inside of the controller.  We've not
checked it at all, so added the check with returning the proper error
status.

Signed-off-by: Minwoo Im <minwoo.im@samsung.com>
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
  • Loading branch information
minwooim authored and birkelund committed Jun 28, 2023
1 parent cab1da5 commit 381ab99
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions hw/nvme/ctrl.c
Expand Up @@ -2855,6 +2855,25 @@ static void nvme_copy_source_range_parse(void *ranges, int idx, uint8_t format,
}
}

static inline uint16_t nvme_check_copy_mcl(NvmeNamespace *ns,
NvmeCopyAIOCB *iocb, uint16_t nr)
{
uint32_t copy_len = 0;

for (int idx = 0; idx < nr; idx++) {
uint32_t nlb;
nvme_copy_source_range_parse(iocb->ranges, idx, iocb->format, NULL,
&nlb, NULL, NULL, NULL);
copy_len += nlb + 1;
}

if (copy_len > ns->id_ns.mcl) {
return NVME_CMD_SIZE_LIMIT | NVME_DNR;
}

return NVME_SUCCESS;
}

static void nvme_copy_out_completed_cb(void *opaque, int ret)
{
NvmeCopyAIOCB *iocb = opaque;
Expand Down Expand Up @@ -3167,6 +3186,11 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req)
}
}

status = nvme_check_copy_mcl(ns, iocb, nr);
if (status) {
goto invalid;
}

iocb->req = req;
iocb->ret = 0;
iocb->nr = nr;
Expand Down

0 comments on commit 381ab99

Please sign in to comment.