nvmet: check ncqr & nsqr for set-features cmd
authorAmit Engel <amit.engel@dell.com>
Sun, 1 Mar 2020 00:28:41 +0000 (16:28 -0800)
committerKeith Busch <kbusch@kernel.org>
Wed, 25 Mar 2020 19:47:03 +0000 (04:47 +0900)
For set feature command when setting up NVME_FEAT_NUM_QUEUES, check
Number of I/O Completion Queues Requested (NCQR) and Number of I/O
Submission Queues Requested (NSQR) before we proceed, for invalid values
(i.e. 65535) return an appropriate NVMe invalid field status.

Signed-off-by: Amit Engel <Amit.Engel@dell.com>
Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/admin-cmd.c

index 19f9495..c0aa9c3 100644 (file)
@@ -733,13 +733,22 @@ static void nvmet_execute_set_features(struct nvmet_req *req)
 {
        struct nvmet_subsys *subsys = req->sq->ctrl->subsys;
        u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10);
+       u32 cdw11 = le32_to_cpu(req->cmd->common.cdw11);
        u16 status = 0;
+       u16 nsqr;
+       u16 ncqr;
 
        if (!nvmet_check_data_len(req, 0))
                return;
 
        switch (cdw10 & 0xff) {
        case NVME_FEAT_NUM_QUEUES:
+               ncqr = (cdw11 >> 16) & 0xffff;
+               nsqr = cdw11 & 0xffff;
+               if (ncqr == 0xffff || nsqr == 0xffff) {
+                       status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
+                       break;
+               }
                nvmet_set_result(req,
                        (subsys->max_qid - 1) | ((subsys->max_qid - 1) << 16));
                break;