From 34369a124340b54fd470aba3c91dc2468f756420 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Fri, 24 Mar 2017 13:37:22 +0800 Subject: [PATCH] nvme: fix potential null dereference of spdk_nvme_ctrlr_get_ns Change-Id: Ibe353e61020caa264cb9b4ad38a091f46ecccfb1 Signed-off-by: Changpeng Liu --- examples/nvme/arbitration/arbitration.c | 7 ++++++- examples/nvme/hello_world/hello_world.c | 7 ++++++- examples/nvme/nvme_manage/nvme_manage.c | 7 ++++++- examples/nvme/perf/perf.c | 7 ++++++- test/lib/nvme/reset/reset.c | 7 ++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/examples/nvme/arbitration/arbitration.c b/examples/nvme/arbitration/arbitration.c index aa9536d02..44e0c1572 100644 --- a/examples/nvme/arbitration/arbitration.c +++ b/examples/nvme/arbitration/arbitration.c @@ -258,6 +258,7 @@ static void register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) { int nsid, num_ns; + struct spdk_nvme_ns *ns; struct ctrlr_entry *entry = calloc(1, sizeof(struct ctrlr_entry)); const struct spdk_nvme_ctrlr_data *cdata = spdk_nvme_ctrlr_get_data(ctrlr); @@ -278,7 +279,11 @@ register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); for (nsid = 1; nsid <= num_ns; nsid++) { - register_ns(ctrlr, spdk_nvme_ctrlr_get_ns(ctrlr, nsid)); + ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); + if (ns == NULL) { + continue; + } + register_ns(ctrlr, ns); } if (g_arbitration.arbitration_mechanism == SPDK_NVME_CAP_AMS_WRR) { diff --git a/examples/nvme/hello_world/hello_world.c b/examples/nvme/hello_world/hello_world.c index 994be679e..81d04decb 100644 --- a/examples/nvme/hello_world/hello_world.c +++ b/examples/nvme/hello_world/hello_world.c @@ -249,6 +249,7 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, { int nsid, num_ns; struct ctrlr_entry *entry; + struct spdk_nvme_ns *ns; const struct spdk_nvme_ctrlr_data *cdata = spdk_nvme_ctrlr_get_data(ctrlr); entry = malloc(sizeof(struct ctrlr_entry)); @@ -276,7 +277,11 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); printf("Using controller %s with %d namespaces.\n", entry->name, num_ns); for (nsid = 1; nsid <= num_ns; nsid++) { - register_ns(ctrlr, spdk_nvme_ctrlr_get_ns(ctrlr, nsid)); + ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); + if (ns == NULL) { + continue; + } + register_ns(ctrlr, ns); } } diff --git a/examples/nvme/nvme_manage/nvme_manage.c b/examples/nvme/nvme_manage/nvme_manage.c index 49f11853e..e0c7fee3f 100644 --- a/examples/nvme/nvme_manage/nvme_manage.c +++ b/examples/nvme/nvme_manage/nvme_manage.c @@ -229,6 +229,7 @@ display_namespace(struct spdk_nvme_ns *ns) static void display_controller(struct dev *dev, int model) { + struct spdk_nvme_ns *ns; const struct spdk_nvme_ctrlr_data *cdata; uint8_t str[128]; uint32_t i; @@ -273,7 +274,11 @@ display_controller(struct dev *dev, int model) printf("Namespace Attributes\n"); printf("============================\n"); for (i = 1; i <= spdk_nvme_ctrlr_get_num_ns(dev->ctrlr); i++) { - display_namespace(spdk_nvme_ctrlr_get_ns(dev->ctrlr, i)); + ns = spdk_nvme_ctrlr_get_ns(dev->ctrlr, i); + if (ns == NULL) { + continue; + } + display_namespace(ns); } } diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index a64cd7306..f8a206536 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -259,6 +259,7 @@ static void register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) { int nsid, num_ns; + struct spdk_nvme_ns *ns; struct ctrlr_entry *entry = malloc(sizeof(struct ctrlr_entry)); const struct spdk_nvme_ctrlr_data *cdata = spdk_nvme_ctrlr_get_data(ctrlr); @@ -286,7 +287,11 @@ register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); for (nsid = 1; nsid <= num_ns; nsid++) { - register_ns(ctrlr, spdk_nvme_ctrlr_get_ns(ctrlr, nsid)); + ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); + if (ns == NULL) { + continue; + } + register_ns(ctrlr, ns); } } diff --git a/test/lib/nvme/reset/reset.c b/test/lib/nvme/reset/reset.c index 2b35fdccb..8e7fa6acc 100644 --- a/test/lib/nvme/reset/reset.c +++ b/test/lib/nvme/reset/reset.c @@ -133,6 +133,7 @@ static void register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) { int nsid, num_ns; + struct spdk_nvme_ns *ns; struct ctrlr_entry *entry = malloc(sizeof(struct ctrlr_entry)); if (entry == NULL) { @@ -146,7 +147,11 @@ register_ctrlr(struct spdk_nvme_ctrlr *ctrlr) num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); for (nsid = 1; nsid <= num_ns; nsid++) { - register_ns(ctrlr, spdk_nvme_ctrlr_get_ns(ctrlr, nsid)); + ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid); + if (ns == NULL) { + continue; + } + register_ns(ctrlr, ns); } }