nvmf: allow NQN to be 223 bytes + null terminator

An ECN to the NVMe 1.3 specification has clarified that the NQN may
contain 223 bytes before the null terminator.  Make all of our NQN
length checks consistently enforce this behavior.

Change-Id: Iebfd57d11abea64964c7a6ad9d886e40efa243c3
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2017-05-18 10:00:36 -07:00
parent 4eda4fd245
commit 5f3841f0e3
5 changed files with 12 additions and 12 deletions

View File

@ -128,7 +128,7 @@ struct spdk_nvmf_subsystem_allowed_listener {
struct spdk_nvmf_subsystem { struct spdk_nvmf_subsystem {
uint32_t id; uint32_t id;
uint32_t lcore; uint32_t lcore;
char subnqn[SPDK_NVMF_NQN_MAX_LEN]; char subnqn[SPDK_NVMF_NQN_MAX_LEN + 1];
enum spdk_nvmf_subsystem_mode mode; enum spdk_nvmf_subsystem_mode mode;
enum spdk_nvmf_subtype subtype; enum spdk_nvmf_subtype subtype;
bool is_removed; bool is_removed;

View File

@ -1109,7 +1109,7 @@ nvme_rdma_discovery_probe(struct spdk_nvmf_discovery_log_page_entry *entry,
trid.adrfam = entry->adrfam; trid.adrfam = entry->adrfam;
/* Ensure that subnqn is null terminated. */ /* Ensure that subnqn is null terminated. */
end = memchr(entry->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN); end = memchr(entry->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN + 1);
if (!end) { if (!end) {
SPDK_ERRLOG("Discovery entry SUBNQN is not null terminated\n"); SPDK_ERRLOG("Discovery entry SUBNQN is not null terminated\n");
return; return;

View File

@ -146,14 +146,14 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
} }
/* Ensure that subnqn and hostnqn are null terminated */ /* Ensure that subnqn and hostnqn are null terminated */
end = memchr(data->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN); end = memchr(data->subnqn, '\0', SPDK_NVMF_NQN_MAX_LEN + 1);
if (!end) { if (!end) {
SPDK_ERRLOG("Connect SUBNQN is not null terminated\n"); SPDK_ERRLOG("Connect SUBNQN is not null terminated\n");
INVALID_CONNECT_DATA(subnqn); INVALID_CONNECT_DATA(subnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
} }
end = memchr(data->hostnqn, '\0', SPDK_NVMF_NQN_MAX_LEN); end = memchr(data->hostnqn, '\0', SPDK_NVMF_NQN_MAX_LEN + 1);
if (!end) { if (!end) {
SPDK_ERRLOG("Connect HOSTNQN is not null terminated\n"); SPDK_ERRLOG("Connect HOSTNQN is not null terminated\n");
INVALID_CONNECT_DATA(hostnqn); INVALID_CONNECT_DATA(hostnqn);

View File

@ -174,8 +174,8 @@ spdk_nvmf_valid_nqn(const char *nqn)
size_t len; size_t len;
len = strlen(nqn); len = strlen(nqn);
if (len >= SPDK_NVMF_NQN_MAX_LEN) { if (len > SPDK_NVMF_NQN_MAX_LEN) {
SPDK_ERRLOG("Invalid NQN \"%s\": length %zu > max %d\n", nqn, len, SPDK_NVMF_NQN_MAX_LEN - 1); SPDK_ERRLOG("Invalid NQN \"%s\": length %zu > max %d\n", nqn, len, SPDK_NVMF_NQN_MAX_LEN);
return false; return false;
} }

View File

@ -218,9 +218,9 @@ nvmf_test_create_subsystem(void)
/* Longest valid name */ /* Longest valid name */
strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn)); strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn));
memset(nqn + strlen(nqn), 'a', 222 - strlen(nqn)); memset(nqn + strlen(nqn), 'a', 223 - strlen(nqn));
nqn[222] = '\0'; nqn[223] = '\0';
CU_ASSERT(strlen(nqn) == 222); CU_ASSERT(strlen(nqn) == 223);
subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME, subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME,
NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL); NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL);
SPDK_CU_ASSERT_FATAL(subsystem != NULL); SPDK_CU_ASSERT_FATAL(subsystem != NULL);
@ -229,9 +229,9 @@ nvmf_test_create_subsystem(void)
/* Name that is one byte longer than allowed */ /* Name that is one byte longer than allowed */
strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn)); strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn));
memset(nqn + strlen(nqn), 'a', 223 - strlen(nqn)); memset(nqn + strlen(nqn), 'a', 224 - strlen(nqn));
nqn[223] = '\0'; nqn[224] = '\0';
CU_ASSERT(strlen(nqn) == 223); CU_ASSERT(strlen(nqn) == 224);
subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME, subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME,
NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL); NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL);
CU_ASSERT(subsystem == NULL); CU_ASSERT(subsystem == NULL);