From: Hannes Reinecke Date: Fri, 10 Sep 2021 16:06:03 +0000 (+0200) Subject: tree: fixup crash on pcie controller for older kernels X-Git-Tag: v1.0-rc0~97^2~4 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c8a7cdb07ee094883d7af7093b1132d5517fe8dd;p=users%2Fsagi%2Flibnvme.git tree: fixup crash on pcie controller for older kernels Older kernels do not provide an 'address' sysfs entry for 'pcie' controllers, causing a crash during scanning. Signed-off-by: Hannes Reinecke --- diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 293b0c0a..6c46ef1b 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -872,7 +872,8 @@ struct nvme_ctrl *nvme_create_ctrl(const char *subsysnqn, const char *transport, errno = EINVAL; return NULL; } - if (strncmp(transport, "loop", 4) && !traddr) { + if (strncmp(transport, "loop", 4) && + strncmp(transport, "pcie", 4) && !traddr) { nvme_msg(LOG_ERR, "No transport address for '%s'\n", transport); errno = EINVAL; return NULL; @@ -1109,7 +1110,7 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_subsystem_t s, const char *path, const char *name) { nvme_ctrl_t c; - char *addr, *address, *a, *e; + char *addr, *address = NULL, *a, *e; char *transport, *traddr = NULL, *trsvcid = NULL; char *host_traddr = NULL, *host_iface = NULL; int ret; @@ -1121,7 +1122,14 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_subsystem_t s, const char *path, } /* Parse 'address' string into components */ addr = nvme_get_attr(path, "address"); - address = strdup(addr); + if (!addr) { + /* Older kernel don't support pcie transport addresses */ + if (strcmp(transport, "pcie")) { + errno = ENXIO; + return NULL; + } + } else + address = strdup(addr); if (!strcmp(transport, "pcie")) { /* The 'address' string is the transport address */ traddr = address;