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:
parent
4eda4fd245
commit
5f3841f0e3
@ -128,7 +128,7 @@ struct spdk_nvmf_subsystem_allowed_listener {
|
||||
struct spdk_nvmf_subsystem {
|
||||
uint32_t id;
|
||||
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_subtype subtype;
|
||||
bool is_removed;
|
||||
|
@ -1109,7 +1109,7 @@ nvme_rdma_discovery_probe(struct spdk_nvmf_discovery_log_page_entry *entry,
|
||||
trid.adrfam = entry->adrfam;
|
||||
|
||||
/* 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) {
|
||||
SPDK_ERRLOG("Discovery entry SUBNQN is not null terminated\n");
|
||||
return;
|
||||
|
@ -146,14 +146,14 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
SPDK_ERRLOG("Connect SUBNQN is not null terminated\n");
|
||||
INVALID_CONNECT_DATA(subnqn);
|
||||
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) {
|
||||
SPDK_ERRLOG("Connect HOSTNQN is not null terminated\n");
|
||||
INVALID_CONNECT_DATA(hostnqn);
|
||||
|
@ -174,8 +174,8 @@ spdk_nvmf_valid_nqn(const char *nqn)
|
||||
size_t len;
|
||||
|
||||
len = strlen(nqn);
|
||||
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);
|
||||
if (len > SPDK_NVMF_NQN_MAX_LEN) {
|
||||
SPDK_ERRLOG("Invalid NQN \"%s\": length %zu > max %d\n", nqn, len, SPDK_NVMF_NQN_MAX_LEN);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -218,9 +218,9 @@ nvmf_test_create_subsystem(void)
|
||||
|
||||
/* Longest valid name */
|
||||
strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn));
|
||||
memset(nqn + strlen(nqn), 'a', 222 - strlen(nqn));
|
||||
nqn[222] = '\0';
|
||||
CU_ASSERT(strlen(nqn) == 222);
|
||||
memset(nqn + strlen(nqn), 'a', 223 - strlen(nqn));
|
||||
nqn[223] = '\0';
|
||||
CU_ASSERT(strlen(nqn) == 223);
|
||||
subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME,
|
||||
NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL);
|
||||
SPDK_CU_ASSERT_FATAL(subsystem != NULL);
|
||||
@ -229,9 +229,9 @@ nvmf_test_create_subsystem(void)
|
||||
|
||||
/* Name that is one byte longer than allowed */
|
||||
strncpy(nqn, "nqn.2016-06.io.spdk:", sizeof(nqn));
|
||||
memset(nqn + strlen(nqn), 'a', 223 - strlen(nqn));
|
||||
nqn[223] = '\0';
|
||||
CU_ASSERT(strlen(nqn) == 223);
|
||||
memset(nqn + strlen(nqn), 'a', 224 - strlen(nqn));
|
||||
nqn[224] = '\0';
|
||||
CU_ASSERT(strlen(nqn) == 224);
|
||||
subsystem = spdk_nvmf_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME,
|
||||
NVMF_SUBSYSTEM_MODE_DIRECT, NULL, NULL, NULL);
|
||||
CU_ASSERT(subsystem == NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user