summaryrefslogtreecommitdiff
path: root/debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch
diff options
context:
space:
mode:
authorDimitri John Ledkov <xnox@ubuntu.com>2018-07-23 11:41:17 +0100
committerDimitri John Ledkov <xnox@ubuntu.com>2018-07-23 11:41:17 +0100
commit3bed5265f9c792edfcd593eeaa93675711e5e264 (patch)
tree60fcbcc5048f276f07022b12d9b34245a6e8ae8d /debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch
parent9421e599c44cd50d3df4cd019cd3c53d9320e93d (diff)
Cherrypick master patches up to 20th of July 2018. LP: #1781427
Diffstat (limited to 'debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch')
-rw-r--r--debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch142
1 files changed, 142 insertions, 0 deletions
diff --git a/debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch b/debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch
new file mode 100644
index 00000000..d3498b72
--- /dev/null
+++ b/debian/patches/0029-Free-map-to-avoid-resource-leak-issues.patch
@@ -0,0 +1,142 @@
+From 898bd1ecefe6c72102f398680dcfef80e4de21c1 Mon Sep 17 00:00:00 2001
+From: Guoqing Jiang <gqjiang@suse.com>
+Date: Mon, 11 Jun 2018 17:03:44 +0800
+Subject: [PATCH 29/40] Free map to avoid resource leak issues
+
+1. There are some places which didn't free map as
+discovered by coverity.
+
+CID 289661 (#1 of 1): Resource leak (RESOURCE_LEAK)12. leaked_storage: Variable mapl going out of scope leaks the storage it points to.
+CID 289619 (#3 of 3): Resource leak (RESOURCE_LEAK)63. leaked_storage: Variable map going out of scope leaks the storage it points to.
+CID 289618 (#1 of 1): Resource leak (RESOURCE_LEAK)26. leaked_storage: Variable map going out of scope leaks the storage it points to.
+CID 289607 (#1 of 1): Resource leak (RESOURCE_LEAK)41. leaked_storage: Variable map going out of scope leaks the storage it points to.
+
+2. If we call map_by_* inside a loop, then map_free
+should be called in the same loop, and it is better
+to set map to NULL after free.
+
+3. And map_unlock is always called with map_lock,
+if we don't call map_remove before map_unlock,
+then the memory (allocated by map_lock -> map_read
+-> map_add -> xmalloc) could be leaked. So we
+need to free it in map_unlock as well.
+
+Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
+Signed-off-by: Jes Sorensen <jsorensen@fb.com>
+---
+ Assemble.c | 2 +-
+ Detail.c | 2 ++
+ Incremental.c | 4 ++++
+ config.c | 3 ++-
+ mapfile.c | 2 ++
+ mdadm.c | 2 ++
+ 6 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/Assemble.c b/Assemble.c
+index 32e6f6ff..5a907c14 100644
+--- a/Assemble.c
++++ b/Assemble.c
+@@ -1851,8 +1851,8 @@ try_again:
+ if (rv == 1 && !pre_exist)
+ ioctl(mdfd, STOP_ARRAY, NULL);
+ free(devices);
+- map_unlock(&map);
+ out:
++ map_unlock(&map);
+ if (rv == 0) {
+ wait_for(chosen_name, mdfd);
+ close(mdfd);
+diff --git a/Detail.c b/Detail.c
+index 860241ce..b3e857a7 100644
+--- a/Detail.c
++++ b/Detail.c
+@@ -263,6 +263,7 @@ int Detail(char *dev, struct context *c)
+
+ if (st->ss->export_detail_super)
+ st->ss->export_detail_super(st);
++ map_free(map);
+ } else {
+ struct map_ent *mp, *map = NULL;
+ char nbuf[64];
+@@ -277,6 +278,7 @@ int Detail(char *dev, struct context *c)
+ print_escape(mp->path+8);
+ putchar('\n');
+ }
++ map_free(map);
+ }
+ if (sra) {
+ struct mdinfo *mdi;
+diff --git a/Incremental.c b/Incremental.c
+index 0beab163..0c5698ee 100644
+--- a/Incremental.c
++++ b/Incremental.c
+@@ -1413,6 +1413,7 @@ restart:
+ sysfs_free(sra);
+ }
+ }
++ map_free(mapl);
+ return rv;
+ }
+
+@@ -1587,6 +1588,8 @@ static int Incremental_container(struct supertype *st, char *devname,
+
+ assemble_container_content(st, mdfd, ra, c,
+ chosen_name, &result);
++ map_free(map);
++ map = NULL;
+ close(mdfd);
+ }
+ if (c->export && result) {
+@@ -1663,6 +1666,7 @@ static int Incremental_container(struct supertype *st, char *devname,
+ close(sfd);
+ }
+ domain_free(domains);
++ map_free(map);
+ return 0;
+ }
+
+diff --git a/config.c b/config.c
+index 48e02788..e14eae0c 100644
+--- a/config.c
++++ b/config.c
+@@ -181,9 +181,10 @@ struct mddev_dev *load_containers(void)
+ }
+ d->next = rv;
+ rv = d;
++ map_free(map);
++ map = NULL;
+ }
+ free_mdstat(mdstat);
+- map_free(map);
+
+ return rv;
+ }
+diff --git a/mapfile.c b/mapfile.c
+index f3c8191e..a5025563 100644
+--- a/mapfile.c
++++ b/mapfile.c
+@@ -143,6 +143,8 @@ void map_unlock(struct map_ent **melp)
+ unlink(mapname[2]);
+ fclose(lf);
+ }
++ if (*melp)
++ map_free(*melp);
+ lf = NULL;
+ }
+
+diff --git a/mdadm.c b/mdadm.c
+index 5afe4155..1cf5c189 100644
+--- a/mdadm.c
++++ b/mdadm.c
+@@ -1885,6 +1885,8 @@ static int misc_scan(char devmode, struct context *c)
+ else
+ rv |= WaitClean(name, c->verbose);
+ put_md_name(name);
++ map_free(map);
++ map = NULL;
+ }
+ }
+ free_mdstat(ms);
+--
+2.17.1
+