[PATCH] Fix memory leak for function Manage_subdevs Manage_add Kill

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux