aboutsummaryrefslogtreecommitdiff
path: root/sbin/nvmecontrol
diff options
context:
space:
mode:
authorDavid Bright <dab@FreeBSD.org>2020-04-02 13:52:54 +0000
committerDavid Bright <dab@FreeBSD.org>2020-04-02 13:52:54 +0000
commit6995fb5eb7f2a9d935f9b75483333455624a11dd (patch)
treeda39298c679f5f7f9adf8b29452bc9d54c4ce6dd /sbin/nvmecontrol
parent3b8de63481ec8fb4b6f89cb34b7d317e108f060e (diff)
downloadsrc-6995fb5eb7f2a9d935f9b75483333455624a11dd.tar.gz
src-6995fb5eb7f2a9d935f9b75483333455624a11dd.zip
Fix various Coverity-detected errors in nvmecontrol
This fixes several Coverity-detected errors in nvmecontrol. While in here, a couple additional errors with shift/mask confusion that were not diagnosed by Coverity are also fixed. CIDs addressed: 1040299, 1040300, 1403972, 1403973, 1403985, 1403988, 1403990, 1404374, 1404427, 1404469, 1404510, 1404534, 1418118 CID 1403657 (resource leak of shared library handle) was marked "intentional" in the Coverity scan database. Reviewed by: vangyzen, robert.herndon_dell.com Reviewed by: daniel.william.ryan_gmail.com (earlier version) Reviewed by: rramsden_isilon.com (earlier version), imp MFC after: 5 days Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D24203
Notes
Notes: svn path=/head/; revision=359562
Diffstat (limited to 'sbin/nvmecontrol')
-rw-r--r--sbin/nvmecontrol/firmware.c2
-rw-r--r--sbin/nvmecontrol/identify.c5
-rw-r--r--sbin/nvmecontrol/logpage.c4
-rw-r--r--sbin/nvmecontrol/modules/wdc/wdc.c2
-rw-r--r--sbin/nvmecontrol/nsid.c3
-rw-r--r--sbin/nvmecontrol/passthru.c16
-rw-r--r--sbin/nvmecontrol/power.c3
-rw-r--r--sbin/nvmecontrol/reset.c3
8 files changed, 27 insertions, 11 deletions
diff --git a/sbin/nvmecontrol/firmware.c b/sbin/nvmecontrol/firmware.c
index 9c7bf5150022..60d2535e9928 100644
--- a/sbin/nvmecontrol/firmware.c
+++ b/sbin/nvmecontrol/firmware.c
@@ -151,6 +151,7 @@ read_image_file(const char *path, void **buf, int32_t *size)
errx(1,
"error reading '%s' (read %d bytes, requested %d bytes)",
path, *size, filesize);
+ close(fd);
}
static void
@@ -188,6 +189,7 @@ update_firmware(int fd, uint8_t *payload, int32_t payload_size)
resid -= size;
off += size;
}
+ free(chunk);
}
static int
diff --git a/sbin/nvmecontrol/identify.c b/sbin/nvmecontrol/identify.c
index b7c7fadc759b..7093de234453 100644
--- a/sbin/nvmecontrol/identify.c
+++ b/sbin/nvmecontrol/identify.c
@@ -94,7 +94,7 @@ print_namespace(struct nvme_namespace_data *nsdata)
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 @@ identify(const struct cmd *f, int argc, char *argv[])
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);
diff --git a/sbin/nvmecontrol/logpage.c b/sbin/nvmecontrol/logpage.c
index 7a36f17aa0df..93a96f0f776f 100644
--- a/sbin/nvmecontrol/logpage.c
+++ b/sbin/nvmecontrol/logpage.c
@@ -570,11 +570,11 @@ print_log_sanitize_status(const struct nvme_controller_data *cdata __unused,
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");
diff --git a/sbin/nvmecontrol/modules/wdc/wdc.c b/sbin/nvmecontrol/modules/wdc/wdc.c
index 88511cce7816..4349dfb273a1 100644
--- a/sbin/nvmecontrol/modules/wdc/wdc.c
+++ b/sbin/nvmecontrol/modules/wdc/wdc.c
@@ -275,7 +275,7 @@ print_hgst_info_subpage_gen(void *buf, uint16_t subtype __unused, uint32_t size,
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);
}
diff --git a/sbin/nvmecontrol/nsid.c b/sbin/nvmecontrol/nsid.c
index deec3021a128..4f98863c5d9f 100644
--- a/sbin/nvmecontrol/nsid.c
+++ b/sbin/nvmecontrol/nsid.c
@@ -70,7 +70,8 @@ gnsid(const struct cmd *f, int argc, char *argv[])
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);
diff --git a/sbin/nvmecontrol/passthru.c b/sbin/nvmecontrol/passthru.c
index 7b4e864a5776..ec7bd0517edc 100644
--- a/sbin/nvmecontrol/passthru.c
+++ b/sbin/nvmecontrol/passthru.c
@@ -158,10 +158,12 @@ static void
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 @@ passthru(const struct cmd *f, int argc, char *argv[])
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 @@ passthru(const struct cmd *f, int argc, char *argv[])
}
}
cleanup:
+ free(data);
+ close(fd);
+ if (ifd > -1)
+ close(ifd);
if (errno)
exit(1);
}
diff --git a/sbin/nvmecontrol/power.c b/sbin/nvmecontrol/power.c
index 71769d1d6d5c..178c0b891990 100644
--- a/sbin/nvmecontrol/power.c
+++ b/sbin/nvmecontrol/power.c
@@ -145,7 +145,8 @@ power(const struct cmd *f, int argc, char *argv[])
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");
diff --git a/sbin/nvmecontrol/reset.c b/sbin/nvmecontrol/reset.c
index 40a45d9bb03c..454f17ef68c2 100644
--- a/sbin/nvmecontrol/reset.c
+++ b/sbin/nvmecontrol/reset.c
@@ -57,7 +57,8 @@ reset(const struct cmd *f, int argc, char *argv[])
{
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)