All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Fix memory leak for function Manage_subdevs Manage_add Kill
@ 2023-02-10 10:28 miaoguanqin
  0 siblings, 0 replies; only message in thread
From: miaoguanqin @ 2023-02-10 10:28 UTC (permalink / raw)
  To: Jes Sorensen, Mariusz Tkaczyk, Paul Menzel, linux-raid
  Cc: linfeilong, liuzhiqiang (I), Wu Guanghao, lixiaokeng

When we excute mdadm,we found some memory leak.
The function call stack is as follows:
#0 in xcalloc
#1 in guess_super_type
#2 in guess_super
#3 in Kill
#4 in misc_list
#5 in main

#0 in __interceptor_posix_memalign
#1 in init_super1
#2 in Kill
#3 in misc_list
#4 in main

#0 in __interceptor_calloc
#1 in xcalloc
#2 in match_metadata_desc1
#3 in super_by_fd
#4 in Manage_subdevs
#5 in main

#0 in __interceptor_calloc
#1 in xcalloc
#2 in dup_super
#3 in Manage_add
#4 in Manage_subdevs
#5 in main

We fix these memory leak based on code logic.

Signed-off-by: miaoguanqin <miaoguanqin@huawei.com>
---
  Kill.c   | 12 ++++++++++--
  Manage.c |  9 ++++++++-
  2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/Kill.c b/Kill.c
index d4767e2..d1207cf 100644
--- a/Kill.c
+++ b/Kill.c
@@ -40,7 +40,8 @@ int Kill(char *dev, struct supertype *st, int force, 
int verbose, int noexcl)
  	 *  2 - failed to open the device.
  	 *  4 - failed to find a superblock.
  	 */
-
+	
+	int flags = 0;
  	int fd, rv = 0;

  	if (force)
@@ -52,8 +53,10 @@ int Kill(char *dev, struct supertype *st, int force, 
int verbose, int noexcl)
  				dev);
  		return 2;
  	}
-	if (st == NULL)
+	if (st == NULL) {
  		st = guess_super(fd);
+		flags = 1;
+	}
  	if (st == NULL || st->ss->init_super == NULL) {
  		if (verbose >= 0)
  			pr_err("Unrecognised md component device - %s\n", dev);
@@ -77,6 +80,11 @@ int Kill(char *dev, struct supertype *st, int force, 
int verbose, int noexcl)
  			rv = 0;
  		}
  	}
+	if (flags == 1 && st) {
+		if (st->sb)
+			free(st->sb);
+		free(st);
+	}
  	close(fd);
  	return rv;
  }
diff --git a/Manage.c b/Manage.c
index ffe55f8..15635eb 100644
--- a/Manage.c
+++ b/Manage.c
@@ -819,9 +819,14 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
  						    rdev, update, devname,
  						    verbose, array);
  				dev_st->ss->free_super(dev_st);
-				if (rv)
+				if (rv){
+					if (dev_st)
+						free(dev_st);
  					return rv;
+				}
  			}
+			if (dev_st)
+				free(dev_st);
  		}
  		if (dv->disposition == 'M') {
  			if (verbose > 0)
@@ -1649,6 +1654,8 @@ int Manage_subdevs(char *devname, int fd,
  			break;
  		}
  	}
+	if (tst)
+		free(tst);
  	if (frozen > 0)
  		sysfs_set_str(&info, NULL, "sync_action","idle");
  	if (test && count == 0)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-10 10:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-10 10:28 [PATCH] Fix memory leak for function Manage_subdevs Manage_add Kill miaoguanqin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.