|
|
7140c6 |
From 3a85bf0e417d0977136efbade7c7ea269e24bc21 Mon Sep 17 00:00:00 2001
|
|
|
7140c6 |
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
|
7140c6 |
Date: Mon, 28 Jun 2021 14:15:04 +0200
|
|
|
7140c6 |
Subject: [PATCH 14/15] imsm: Fix possible memory leaks and refactor freeing
|
|
|
7140c6 |
struct dl
|
|
|
7140c6 |
|
|
|
7140c6 |
Free memory allocated by structs dl and intel_super.
|
|
|
7140c6 |
Allow __free_imsm_disk to decide if fd has to be closed and propagate it
|
|
|
7140c6 |
across code instead of direct struct dl freeing.
|
|
|
7140c6 |
|
|
|
7140c6 |
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
|
7140c6 |
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
|
|
|
7140c6 |
---
|
|
|
7140c6 |
super-intel.c | 39 +++++++++++++++++++--------------------
|
|
|
7140c6 |
1 file changed, 19 insertions(+), 20 deletions(-)
|
|
|
7140c6 |
|
|
|
7140c6 |
diff --git a/super-intel.c b/super-intel.c
|
|
|
7140c6 |
index aeea137..da37625 100644
|
|
|
7140c6 |
--- a/super-intel.c
|
|
|
7140c6 |
+++ b/super-intel.c
|
|
|
7140c6 |
@@ -4499,9 +4499,9 @@ load_and_parse_mpb(int fd, struct intel_super *super, char *devname, int keep_fd
|
|
|
7140c6 |
return err;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
-static void __free_imsm_disk(struct dl *d)
|
|
|
7140c6 |
+static void __free_imsm_disk(struct dl *d, int close_fd)
|
|
|
7140c6 |
{
|
|
|
7140c6 |
- if (d->fd >= 0)
|
|
|
7140c6 |
+ if (close_fd && d->fd > -1)
|
|
|
7140c6 |
close(d->fd);
|
|
|
7140c6 |
if (d->devname)
|
|
|
7140c6 |
free(d->devname);
|
|
|
7140c6 |
@@ -4518,17 +4518,17 @@ static void free_imsm_disks(struct intel_super *super)
|
|
|
7140c6 |
while (super->disks) {
|
|
|
7140c6 |
d = super->disks;
|
|
|
7140c6 |
super->disks = d->next;
|
|
|
7140c6 |
- __free_imsm_disk(d);
|
|
|
7140c6 |
+ __free_imsm_disk(d, 1);
|
|
|
7140c6 |
}
|
|
|
7140c6 |
while (super->disk_mgmt_list) {
|
|
|
7140c6 |
d = super->disk_mgmt_list;
|
|
|
7140c6 |
super->disk_mgmt_list = d->next;
|
|
|
7140c6 |
- __free_imsm_disk(d);
|
|
|
7140c6 |
+ __free_imsm_disk(d, 1);
|
|
|
7140c6 |
}
|
|
|
7140c6 |
while (super->missing) {
|
|
|
7140c6 |
d = super->missing;
|
|
|
7140c6 |
super->missing = d->next;
|
|
|
7140c6 |
- __free_imsm_disk(d);
|
|
|
7140c6 |
+ __free_imsm_disk(d, 1);
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
}
|
|
|
7140c6 |
@@ -5243,10 +5243,13 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
|
|
|
7140c6 |
free_super_imsm(st);
|
|
|
7140c6 |
|
|
|
7140c6 |
super = alloc_super();
|
|
|
7140c6 |
- if (!get_dev_sector_size(fd, NULL, &super->sector_size))
|
|
|
7140c6 |
- return 1;
|
|
|
7140c6 |
if (!super)
|
|
|
7140c6 |
return 1;
|
|
|
7140c6 |
+
|
|
|
7140c6 |
+ if (!get_dev_sector_size(fd, NULL, &super->sector_size)) {
|
|
|
7140c6 |
+ free_imsm(super);
|
|
|
7140c6 |
+ return 1;
|
|
|
7140c6 |
+ }
|
|
|
7140c6 |
/* Load hba and capabilities if they exist.
|
|
|
7140c6 |
* But do not preclude loading metadata in case capabilities or hba are
|
|
|
7140c6 |
* non-compliant and ignore_hw_compat is set.
|
|
|
7140c6 |
@@ -5884,9 +5887,7 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
|
|
7140c6 |
rv = imsm_read_serial(fd, devname, dd->serial, MAX_RAID_SERIAL_LEN);
|
|
|
7140c6 |
if (rv) {
|
|
|
7140c6 |
pr_err("failed to retrieve scsi serial, aborting\n");
|
|
|
7140c6 |
- if (dd->devname)
|
|
|
7140c6 |
- free(dd->devname);
|
|
|
7140c6 |
- free(dd);
|
|
|
7140c6 |
+ __free_imsm_disk(dd, 0);
|
|
|
7140c6 |
abort();
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
@@ -5900,10 +5901,7 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
|
|
7140c6 |
if (!diskfd_to_devpath(fd, 2, pci_dev_path) ||
|
|
|
7140c6 |
!diskfd_to_devpath(fd, 1, cntrl_path)) {
|
|
|
7140c6 |
pr_err("failed to get dev paths, aborting\n");
|
|
|
7140c6 |
-
|
|
|
7140c6 |
- if (dd->devname)
|
|
|
7140c6 |
- free(dd->devname);
|
|
|
7140c6 |
- free(dd);
|
|
|
7140c6 |
+ __free_imsm_disk(dd, 0);
|
|
|
7140c6 |
return 1;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
@@ -5939,15 +5937,16 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
|
|
7140c6 |
!imsm_orom_has_tpv_support(super->orom)) {
|
|
|
7140c6 |
pr_err("\tPlatform configuration does not support non-Intel NVMe drives.\n"
|
|
|
7140c6 |
"\tPlease refer to Intel(R) RSTe/VROC user guide.\n");
|
|
|
7140c6 |
- free(dd->devname);
|
|
|
7140c6 |
- free(dd);
|
|
|
7140c6 |
+ __free_imsm_disk(dd, 0);
|
|
|
7140c6 |
return 1;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
get_dev_size(fd, NULL, &size);
|
|
|
7140c6 |
- if (!get_dev_sector_size(fd, NULL, &member_sector_size))
|
|
|
7140c6 |
+ if (!get_dev_sector_size(fd, NULL, &member_sector_size)) {
|
|
|
7140c6 |
+ __free_imsm_disk(dd, 0);
|
|
|
7140c6 |
return 1;
|
|
|
7140c6 |
+ }
|
|
|
7140c6 |
|
|
|
7140c6 |
if (super->sector_size == 0) {
|
|
|
7140c6 |
/* this a first device, so sector_size is not set yet */
|
|
|
7140c6 |
@@ -9260,7 +9259,7 @@ static int remove_disk_super(struct intel_super *super, int major, int minor)
|
|
|
7140c6 |
else
|
|
|
7140c6 |
super->disks = dl->next;
|
|
|
7140c6 |
dl->next = NULL;
|
|
|
7140c6 |
- __free_imsm_disk(dl);
|
|
|
7140c6 |
+ __free_imsm_disk(dl, 1);
|
|
|
7140c6 |
dprintf("removed %x:%x\n", major, minor);
|
|
|
7140c6 |
break;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
@@ -9310,7 +9309,7 @@ static int add_remove_disk_update(struct intel_super *super)
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
/* release allocate disk structure */
|
|
|
7140c6 |
- __free_imsm_disk(disk_cfg);
|
|
|
7140c6 |
+ __free_imsm_disk(disk_cfg, 1);
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
return check_degraded;
|
|
|
7140c6 |
@@ -10511,7 +10510,7 @@ static void imsm_delete(struct intel_super *super, struct dl **dlp, unsigned ind
|
|
|
7140c6 |
struct dl *dl = *dlp;
|
|
|
7140c6 |
|
|
|
7140c6 |
*dlp = (*dlp)->next;
|
|
|
7140c6 |
- __free_imsm_disk(dl);
|
|
|
7140c6 |
+ __free_imsm_disk(dl, 1);
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
--
|
|
|
7140c6 |
2.7.5
|
|
|
7140c6 |
|