From 7ce5849489383f2bca169533d1c99bb0461d6298 Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Wed, 28 Oct 2015 15:51:58 -0600 Subject: [PATCH] fix off by one error Need to use a larger int type because 256 doesn't fit in 8 bits, and subtract 1 becase number of ranges is 0's based. Signed-off-by: Keith Busch --- nvme.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 97d9f960..28c059b1 100644 --- a/nvme.c +++ b/nvme.c @@ -2740,7 +2740,7 @@ static int dsm(int argc, char **argv) const char *cdw11 = "All the command command dword 11 attribuets. Use instead of specifying individual attributes"; int i, err; - uint8_t nr, nc, nb, ns; + uint16_t nr, nc, nb, ns; __u32 ctx_attrs[256]; __u32 nlbs[256]; __u64 slbas[256]; @@ -2802,7 +2802,7 @@ static int dsm(int argc, char **argv) nb = argconfig_parse_comma_sep_array(cfg.blocks, (int *)nlbs, 256); ns = argconfig_parse_comma_sep_array_long(cfg.slbas, slbas, 256); nr = max(nc, max(nb, ns)); - if (!nr) { + if (!nr || nr > 256) { fprintf(stderr, "No range definition provided\n"); return EINVAL; } @@ -2842,7 +2842,7 @@ static int dsm(int argc, char **argv) cmd.opcode = nvme_cmd_dsm; cmd.addr = (__u64)((unsigned long)buffer); cmd.data_len = nr * sizeof(struct nvme_dsm_range); - cmd.cdw10 = nr; + cmd.cdw10 = nr - 1; cmd.cdw11 = cfg.cdw11; err = ioctl(fd, NVME_IOCTL_IO_CMD, &cmd); -- 2.50.1