From 29b5ff11d51ffa5bc83dc8098c34910cb43bfb46 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Wed, 24 Jul 2013 22:40:34 +0000 Subject: MFC r253437: Define constants for the lengths of the serial number, model number and firmware revision in the controller's identify structure. Also modify consumers of these fields to ensure they only use the specified number of bytes for their respective fields. Approved by: re (kib) Sponsored by: Intel --- sbin/nvmecontrol/devlist.c | 2 +- sbin/nvmecontrol/identify.c | 9 ++++++--- sys/dev/nvd/nvd.c | 8 ++++++-- sys/dev/nvme/nvme.h | 10 +++++++--- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sbin/nvmecontrol/devlist.c b/sbin/nvmecontrol/devlist.c index 2e81e761778e..2a9583294673 100644 --- a/sbin/nvmecontrol/devlist.c +++ b/sbin/nvmecontrol/devlist.c @@ -90,7 +90,7 @@ devlist(int argc, char *argv[]) found++; read_controller_data(fd, &cdata); - printf("%6s: %s\n", name, cdata.mn); + printf("%6s: %.*s\n", name, NVME_MODEL_NUMBER_LENGTH, cdata.mn); for (i = 0; i < cdata.nn; i++) { sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr, diff --git a/sbin/nvmecontrol/identify.c b/sbin/nvmecontrol/identify.c index 7cc499c031e6..65854303566b 100644 --- a/sbin/nvmecontrol/identify.c +++ b/sbin/nvmecontrol/identify.c @@ -47,9 +47,12 @@ print_controller(struct nvme_controller_data *cdata) printf("================================\n"); printf("Vendor ID: %04x\n", cdata->vid); printf("Subsystem Vendor ID: %04x\n", cdata->ssvid); - printf("Serial Number: %s\n", cdata->sn); - printf("Model Number: %s\n", cdata->mn); - printf("Firmware Version: %s\n", cdata->fr); + printf("Serial Number: %.*s\n", + NVME_SERIAL_NUMBER_LENGTH, cdata->sn); + printf("Model Number: %.*s\n", + NVME_MODEL_NUMBER_LENGTH, cdata->mn); + printf("Firmware Version: %.*s\n", + NVME_FIRMWARE_REVISION_LENGTH, cdata->fr); printf("Recommended Arb Burst: %d\n", cdata->rab); printf("IEEE OUI Identifier: %02x %02x %02x\n", cdata->ieee[0], cdata->ieee[1], cdata->ieee[2]); diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c index 1d2d8919d238..868a238301dc 100644 --- a/sys/dev/nvd/nvd.c +++ b/sys/dev/nvd/nvd.c @@ -306,12 +306,16 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) disk->d_flags |= DISKFLAG_UNMAPPED_BIO; #endif + /* + * d_ident and d_descr are both far bigger than the length of either + * the serial or model number strings. + */ strlcpy(disk->d_ident, nvme_ns_get_serial_number(ns), - sizeof(disk->d_ident)); + min(sizeof(disk->d_ident), NVME_SERIAL_NUMBER_LENGTH)); #if __FreeBSD_version >= 900034 strlcpy(disk->d_descr, nvme_ns_get_model_number(ns), - sizeof(disk->d_descr)); + min(sizeof(disk->d_descr), NVME_MODEL_NUMBER_LENGTH)); #endif disk_create(disk, DISK_VERSION); diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h index df409cc7cfb3..f30505a7bc8f 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -389,6 +389,10 @@ enum nvme_activate_action { NVME_AA_ACTIVATE = 0x2, }; +#define NVME_SERIAL_NUMBER_LENGTH 20 +#define NVME_MODEL_NUMBER_LENGTH 40 +#define NVME_FIRMWARE_REVISION_LENGTH 8 + struct nvme_controller_data { /* bytes 0-255: controller capabilities and features */ @@ -400,13 +404,13 @@ struct nvme_controller_data { uint16_t ssvid; /** serial number */ - int8_t sn[20]; + int8_t sn[NVME_SERIAL_NUMBER_LENGTH]; /** model number */ - int8_t mn[40]; + int8_t mn[NVME_MODEL_NUMBER_LENGTH]; /** firmware revision */ - uint8_t fr[8]; + uint8_t fr[NVME_FIRMWARE_REVISION_LENGTH]; /** recommended arbitration burst */ uint8_t rab; -- cgit v1.3