From 242eb6b4c2ab45a7e6211cfb76f7af0b2e1e310c Mon Sep 17 00:00:00 2001 From: Zhiqiang Liu Date: Sun, 13 Jun 2021 18:59:13 +0800 Subject: [PATCH] nvmf:check return value of strdup in spdk_nvmf_subsystem_add_ns_ext() In spdk_nvmf_subsystem_add_ns_ext(), ns->ptpl_file is set to strdup(), which may return NULL. We should deal with it. Signed-off-by: Zhiqiang Liu Change-Id: If95102fe9d6d789b8ba9e846c4d7f4e22e48a93c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8305 Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins --- lib/nvmf/subsystem.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 542fd32a2..1da2a278b 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -1472,14 +1472,14 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char rc = nvmf_ns_reservation_restore(ns, &info); if (rc) { SPDK_ERRLOG("Subsystem restore reservation failed\n"); - subsystem->ns[opts.nsid - 1] = NULL; - spdk_bdev_module_release_bdev(ns->bdev); - spdk_bdev_close(ns->desc); - free(ns); - return 0; + goto err_ns_reservation_restore; } } ns->ptpl_file = strdup(ptpl_file); + if (!ns->ptpl_file) { + SPDK_ERRLOG("Namespace ns->ptpl_file allocation failed\n"); + goto err_strdup; + } } for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport; @@ -1488,13 +1488,7 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char rc = transport->ops->subsystem_add_ns(transport, subsystem, ns); if (rc) { SPDK_ERRLOG("Namespace attachment is not allowed by %s transport\n", transport->ops->name); - free(ns->ptpl_file); - nvmf_ns_reservation_clear_all_registrants(ns); - subsystem->ns[opts.nsid - 1] = NULL; - spdk_bdev_module_release_bdev(ns->bdev); - spdk_bdev_close(ns->desc); - free(ns); - return 0; + goto err_subsystem_add_ns; } } } @@ -1507,6 +1501,18 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char nvmf_subsystem_ns_changed(subsystem, opts.nsid); return opts.nsid; + +err_subsystem_add_ns: + free(ns->ptpl_file); +err_strdup: + nvmf_ns_reservation_clear_all_registrants(ns); +err_ns_reservation_restore: + subsystem->ns[opts.nsid - 1] = NULL; + spdk_bdev_module_release_bdev(ns->bdev); + spdk_bdev_close(ns->desc); + free(ns); + return 0; + } static uint32_t