]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
Fix memory leak when nvme_scan_toplopy return failed
authorWu Bo <wubo.linux@gmail.com>
Thu, 7 Apr 2022 06:50:26 +0000 (14:50 +0800)
committerWu Bo <wubo.linux@gmail.com>
Thu, 7 Apr 2022 06:50:26 +0000 (14:50 +0800)
fabrics.c
nvme.c

index 5f850e5812105b133308024d2f9473823224f547..4ae40819c1ff4d510233fef4989ce2a2cb717d53 100644 (file)
--- a/fabrics.c
+++ b/fabrics.c
@@ -575,6 +575,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
        if (ret < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return ret;
        }
 
@@ -766,6 +767,7 @@ int nvmf_connect(const char *desc, int argc, char **argv)
        if (ret < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return ret;
        }
        nvme_read_config(r, config_file);
@@ -861,6 +863,7 @@ int nvmf_disconnect(const char *desc, int argc, char **argv)
        if (ret < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return ret;
        }
 
@@ -947,6 +950,7 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv)
        if (ret < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return ret;
        }
 
@@ -1017,6 +1021,7 @@ int nvmf_config(const char *desc, int argc, char **argv)
                if (ret < 0) {
                        fprintf(stderr, "Failed to scan topoplogy: %s\n",
                                nvme_strerror(errno));
+                       nvme_free_tree(r);
                        return ret;
                }
        }
@@ -1155,6 +1160,7 @@ int nvmf_dim(const char *desc, int argc, char **argv)
        if (ret < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return ret;
        }
 
diff --git a/nvme.c b/nvme.c
index 5f7763ce923a435f1e8f0702fc30dc676599bd62..d7d895ec8ec70dc3f3c6c39ed13f80938327eb9d 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -2503,7 +2503,7 @@ static bool nvme_match_device_filter(nvme_subsystem_t s)
 static int list_subsys(int argc, char **argv, struct command *cmd,
                struct plugin *plugin)
 {
-       nvme_root_t r;
+       nvme_root_t r = NULL;
        enum nvme_print_flags flags;
        const char *desc = "Retrieve information for subsystems";
        const char *verbose = "Increase output verbosity";
@@ -2577,9 +2577,9 @@ static int list_subsys(int argc, char **argv, struct command *cmd,
        }
 
        nvme_show_subsystem_list(r, nsid, flags);
-       nvme_free_tree(r);
-
 ret:
+       if (r)
+               nvme_free_tree(r);
        return err;
 }
 
@@ -2631,6 +2631,7 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi
        if (err < 0) {
                fprintf(stderr, "Failed to scan topoplogy: %s\n",
                         nvme_strerror(errno));
+               nvme_free_tree(r);
                return err;
        }