From 7d374a1869d3a84971d027a7f4233878c8f25a62 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Tue, 27 Jul 2021 10:25:18 +0200 Subject: [PATCH] Fix memory leak after "mdadm --detail" Signed-off-by: Mateusz Grzonka Signed-off-by: Jes Sorensen --- Detail.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Detail.c b/Detail.c index ad56344..d3af0ab 100644 --- a/Detail.c +++ b/Detail.c @@ -66,11 +66,11 @@ int Detail(char *dev, struct context *c) int spares = 0; struct stat stb; int failed = 0; - struct supertype *st; + struct supertype *st = NULL; char *subarray = NULL; int max_disks = MD_SB_DISKS; /* just a default */ struct mdinfo *info = NULL; - struct mdinfo *sra; + struct mdinfo *sra = NULL; struct mdinfo *subdev; char *member = NULL; char *container = NULL; @@ -93,8 +93,7 @@ int Detail(char *dev, struct context *c) if (!sra) { if (md_get_array_info(fd, &array)) { pr_err("%s does not appear to be an md device\n", dev); - close(fd); - return rv; + goto out; } } external = (sra != NULL && sra->array.major_version == -1 && @@ -108,16 +107,13 @@ int Detail(char *dev, struct context *c) sra->devs == NULL) { pr_err("Array associated with md device %s does not exist.\n", dev); - close(fd); - sysfs_free(sra); - return rv; + goto out; } array = sra->array; } else { pr_err("cannot get array detail for %s: %s\n", dev, strerror(errno)); - close(fd); - return rv; + goto out; } } @@ -827,10 +823,12 @@ out: close(fd); free(subarray); free(avail); - for (d = 0; d < n_devices; d++) - free(devices[d]); + if (devices) + for (d = 0; d < n_devices; d++) + free(devices[d]); free(devices); sysfs_free(sra); + free(st); return rv; }