From 5c9dccc96289801cfe9bda5f1e7dc4edf9a33e01 Mon Sep 17 00:00:00 2001 From: Ziye Yang Date: Mon, 8 Oct 2018 22:27:28 +0800 Subject: [PATCH] nvme: fix the parse of spdk_nvme_transport_id_parse Normally, there will be only one separator in transport id, for example, either ':' or '='. But the users may input this: trtype=PCIe traddr=0000:81:00.0. Thus, there will be two diffrent separator '=' and ':', and our function doest not handle this case correctly. And this patch can fix this issue, and also update the test case. Change-Id: Ic3f10dc1e37c66647fede37c5cf9523fc2652677 Signed-off-by: Ziye Yang Reviewed-on: https://review.gerrithub.io/428307 Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu --- lib/nvme/nvme.c | 7 ++++++- test/unit/lib/nvme/nvme.c/nvme_ut.c | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index ffe733ae9..dc657966f 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -711,7 +711,7 @@ spdk_nvme_transport_id_adrfam_str(enum spdk_nvmf_adrfam adrfam) int spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *str) { - const char *sep; + const char *sep, *sep1; const char *whitespace = " \t\n"; size_t key_len, val_len; char key[32]; @@ -731,6 +731,11 @@ spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *st SPDK_ERRLOG("Key without ':' or '=' separator\n"); return -EINVAL; } + } else { + sep1 = strchr(str, '='); + if ((sep1 != NULL) && (sep1 < sep)) { + sep = sep1; + } } key_len = sep - str; diff --git a/test/unit/lib/nvme/nvme.c/nvme_ut.c b/test/unit/lib/nvme/nvme.c/nvme_ut.c index a339cb8e9..6925a2cfd 100644 --- a/test/unit/lib/nvme/nvme.c/nvme_ut.c +++ b/test/unit/lib/nvme/nvme.c/nvme_ut.c @@ -913,6 +913,11 @@ test_trid_parse_and_compare(void) CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:04:00.0") == 0); CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:05:00.0") == 0); CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) < 0); + + memset_trid(&trid1, &trid2); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype=PCIe traddr=0000:04:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype=PCIe traddr=05:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) < 0); } static void