Index: sbin/nvmecontrol/firmware.c =================================================================== --- sbin/nvmecontrol/firmware.c +++ sbin/nvmecontrol/firmware.c @@ -151,6 +151,7 @@ errx(1, "error reading '%s' (read %d bytes, requested %d bytes)", path, *size, filesize); + close(fd); } static void @@ -188,6 +189,7 @@ resid -= size; off += size; } + free(chunk); } static int Index: sbin/nvmecontrol/identify.c =================================================================== --- sbin/nvmecontrol/identify.c +++ sbin/nvmecontrol/identify.c @@ -94,7 +94,7 @@ NVME_NS_DATA_DPC_PIT3_MASK) ? "Type 3, " : "", ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_SHIFT) & NVME_NS_DATA_DPC_PIT2_MASK) ? "Type 2, " : "", - ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_MASK) & + ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT1_SHIFT) & NVME_NS_DATA_DPC_PIT1_MASK) ? "Type 1" : ""); printf("Data Protection Settings: "); ptype = (nsdata->dps >> NVME_NS_DATA_DPS_PIT_SHIFT) & @@ -238,7 +238,8 @@ int fd; uint32_t nsid; - arg_parse(argc, argv, f); + if (arg_parse(argc, argv, f)) + return; open_dev(opt.dev, &fd, 1, 1); get_nsid(fd, &path, &nsid); Index: sbin/nvmecontrol/logpage.c =================================================================== --- sbin/nvmecontrol/logpage.c +++ sbin/nvmecontrol/logpage.c @@ -570,11 +570,11 @@ printf("Unknown"); break; } - p = (ss->sstat & NVME_SS_PAGE_SSTAT_PASSES_SHIFT) >> + p = (ss->sstat >> NVME_SS_PAGE_SSTAT_PASSES_SHIFT) & NVME_SS_PAGE_SSTAT_PASSES_MASK; if (p > 0) printf(", %d passes", p); - if ((ss->sstat & NVME_SS_PAGE_SSTAT_GDE_SHIFT) >> + if ((ss->sstat >> NVME_SS_PAGE_SSTAT_GDE_SHIFT) & NVME_SS_PAGE_SSTAT_GDE_MASK) printf(", Global Data Erased"); printf("\n"); Index: sbin/nvmecontrol/modules/wdc/wdc.c =================================================================== --- sbin/nvmecontrol/modules/wdc/wdc.c +++ sbin/nvmecontrol/modules/wdc/wdc.c @@ -275,7 +275,7 @@ wsp++; /* Flags, just ignore */ plen = *wsp++; param = 0; - for (i = 0; i < plen; i++) + for (i = 0; i < plen && wsp < esp; i++) param |= (uint64_t)*wsp++ << (i * 8); printf(" %-30s: %jd\n", kv_lookup(kv, kv_count, ptype), (uintmax_t)param); } Index: sbin/nvmecontrol/nsid.c =================================================================== --- sbin/nvmecontrol/nsid.c +++ sbin/nvmecontrol/nsid.c @@ -70,7 +70,8 @@ int fd; uint32_t nsid; - arg_parse(argc, argv, f); + if (arg_parse(argc, argv, f)) + return; open_dev(nsid_opt.dev, &fd, 1, 1); get_nsid(fd, &path, &nsid); Index: sbin/nvmecontrol/passthru.c =================================================================== --- sbin/nvmecontrol/passthru.c +++ sbin/nvmecontrol/passthru.c @@ -158,10 +158,12 @@ passthru(const struct cmd *f, int argc, char *argv[]) { int fd = -1, ifd = -1; + size_t bytes_read; void *data = NULL, *metadata = NULL; struct nvme_pt_command pt; - arg_parse(argc, argv, f); + if (arg_parse(argc, argv, f)) + return; open_dev(argv[optind], &fd, 1, 1); if (opt.read && opt.write) @@ -189,8 +191,12 @@ goto cleanup; } memset(data, opt.prefill, opt.data_len); - if (opt.write && read(ifd, data, opt.data_len) < 0) { - warn("read %s", *opt.ifn ? opt.ifn : "stdin"); + if (opt.write && + (bytes_read = read(ifd, data, opt.data_len)) != + opt.data_len) { + warn("read %s; expected %u bytes; got %zd", + *opt.ifn ? opt.ifn : "stdin", + opt.data_len, bytes_read); goto cleanup; } } @@ -249,6 +255,10 @@ } } cleanup: + free(data); + close(fd); + if (ifd > -1) + close(ifd); if (errno) exit(1); } Index: sbin/nvmecontrol/power.c =================================================================== --- sbin/nvmecontrol/power.c +++ sbin/nvmecontrol/power.c @@ -145,7 +145,8 @@ struct nvme_controller_data cdata; int fd; - arg_parse(argc, argv, f); + if (arg_parse(argc, argv, f)) + return; if (opt.list && opt.power != POWER_NONE) { fprintf(stderr, "Can't set power and list power states\n"); Index: sbin/nvmecontrol/reset.c =================================================================== --- sbin/nvmecontrol/reset.c +++ sbin/nvmecontrol/reset.c @@ -57,7 +57,8 @@ { int fd; - arg_parse(argc, argv, f); + if (arg_parse(argc, argv, f)) + return; open_dev(opt.dev, &fd, 1, 1); if (ioctl(fd, NVME_RESET_CONTROLLER) < 0)