nvme: Fix u32 overflow in the number of namespace list calculation
authorJaesoo Lee <jalee@purestorage.com>
Mon, 3 Jun 2019 23:42:28 +0000 (16:42 -0700)
committerSagi Grimberg <sagi@grimberg.me>
Thu, 6 Jun 2019 16:53:07 +0000 (09:53 -0700)
The Number of Namespaces (nn) field in the identify controller data structure is
defined as u32 and the maximum allowed value in NVMe specification is
0xFFFFFFFEUL. This change fixes the possible overflow of the DIV_ROUND_UP()
operation used in nvme_scan_ns_list() by casting the nn to u64.

Signed-off-by: Jaesoo Lee <jalee@purestorage.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
drivers/nvme/host/core.c

index 1b7c2afd84cbb5f4971cb2ef8fba6a48a518da4c..120fb593d1da46665e92dc095a55c6cf05882d89 100644 (file)
@@ -3400,7 +3400,8 @@ static int nvme_scan_ns_list(struct nvme_ctrl *ctrl, unsigned nn)
 {
        struct nvme_ns *ns;
        __le32 *ns_list;
-       unsigned i, j, nsid, prev = 0, num_lists = DIV_ROUND_UP(nn, 1024);
+       unsigned i, j, nsid, prev = 0;
+       unsigned num_lists = DIV_ROUND_UP_ULL((u64)nn, 1024);
        int ret = 0;
 
        ns_list = kzalloc(NVME_IDENTIFY_DATA_SIZE, GFP_KERNEL);