]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
tree: fixup crash on pcie controller for older kernels
authorHannes Reinecke <hare@suse.de>
Fri, 10 Sep 2021 16:06:03 +0000 (18:06 +0200)
committerHannes Reinecke <hare@suse.de>
Fri, 10 Sep 2021 16:08:03 +0000 (18:08 +0200)
Older kernels do not provide an 'address' sysfs entry for 'pcie'
controllers, causing a crash during scanning.

Signed-off-by: Hannes Reinecke <hare@suse.de>
src/nvme/tree.c

index 293b0c0a2b086a163f2bd9134034eecef9c759c4..6c46ef1b3109ae6d4591477cc88a44ac373b8e0a 100644 (file)
@@ -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;