From: Keith Busch Date: Wed, 28 Oct 2015 21:51:58 +0000 (-0600) Subject: fix off by one error X-Git-Tag: v0.3~17 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=7ce5849489383f2bca169533d1c99bb0461d6298;p=users%2Fsagi%2Fnvme-cli.git 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 --- 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);