[CRIU] [PATCH] mount: free all parts of mnt entries

Andrey Vagin avagin at openvz.org
Sat Apr 6 14:38:20 EDT 2013


mnt_entry contains a few strings and they should be release too

CID 996198 (#4 of 4): Resource leak (RESOURCE_LEAK)
20. leaked_storage: Variable "pm" going out of scope leaks the storage
it points to.

CID 996190 (#1 of 1): Resource leak (RESOURCE_LEAK)
13. leaked_storage: Variable "new" going out of scope leaks the storage
it points to.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 include/proc_parse.h |  7 ++-----
 mount.c              | 40 +++++++++++++++++++++++++++++++++++-----
 proc_parse.c         | 10 ++++------
 3 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/include/proc_parse.h b/include/proc_parse.h
index 659affb..9459872 100644
--- a/include/proc_parse.h
+++ b/include/proc_parse.h
@@ -117,11 +117,8 @@ struct mount_info {
 	struct list_head siblings;
 };
 
-static inline void mnt_entry_init(struct mount_info *pm)
-{
-	pm->parent = NULL;
-	INIT_LIST_HEAD(&pm->children);
-}
+extern struct mount_info *mnt_entry_alloc();
+extern void mnt_entry_free(struct mount_info *mi);
 
 struct vm_area_list;
 
diff --git a/mount.c b/mount.c
index dd271f1..e60005c 100644
--- a/mount.c
+++ b/mount.c
@@ -633,6 +633,37 @@ static int cr_pivot_root()
 	return 0;
 }
 
+struct mount_info *mnt_entry_alloc()
+{
+	struct mount_info *new;
+
+	new = xmalloc(sizeof(struct mount_info));
+	if (new == NULL)
+		return NULL;
+
+	new->root	= NULL;
+	new->mountpoint	= NULL;
+	new->source	= NULL;
+	new->options	= NULL;
+
+	new->parent = NULL;
+	INIT_LIST_HEAD(&new->children);
+
+	return new;
+}
+
+void mnt_entry_free(struct mount_info *mi)
+{
+	if (mi == NULL)
+		return;
+
+	xfree(mi->root);
+	xfree(mi->mountpoint);
+	xfree(mi->source);
+	xfree(mi->options);
+	xfree(mi);
+}
+
 static int populate_mnt_ns(int ns_pid)
 {
 	MntEntry *me = NULL;
@@ -654,11 +685,12 @@ static int populate_mnt_ns(int ns_pid)
 		if (ret <= 0)
 			break;
 
-		pm = xmalloc(sizeof(*pm));
+		pm = mnt_entry_alloc();
 		if (!pm)
 			goto err;
 
-		mnt_entry_init(pm);
+		pm->next = pms;
+		pms = pm;
 
 		pm->mnt_id		= me->mnt_id;
 		pm->parent_mnt_id	= me->parent_mnt_id;
@@ -689,8 +721,6 @@ static int populate_mnt_ns(int ns_pid)
 			goto err;
 
 		pr_debug("\tRead %d mp @ %s\n", pm->mnt_id, pm->mountpoint);
-		pm->next = pms;
-		pms = pm;
 	}
 
 	if (me)
@@ -708,7 +738,7 @@ err:
 	while (pms) {
 		struct mount_info *pm = pms;
 		pms = pm->next;
-		xfree(pm);
+		mnt_entry_free(pm);
 	}
 	close_safe(&img);
 	return -1;
diff --git a/proc_parse.c b/proc_parse.c
index 1315aba..b064a75 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -799,11 +799,12 @@ struct mount_info *parse_mountinfo(pid_t pid)
 		struct mount_info *new;
 		int ret;
 
-		new = xmalloc(sizeof(*new));
+		new = mnt_entry_alloc();
 		if (!new)
 			goto err;
 
-		mnt_entry_init(new);
+		new->next = list;
+		list = new;
 
 		ret = parse_mountinfo_ent(str, new);
 		if (ret < 0) {
@@ -815,9 +816,6 @@ struct mount_info *parse_mountinfo(pid_t pid)
 				new->fstype->name, new->source,
 				new->s_dev, new->root, new->mountpoint,
 				new->flags, new->options);
-
-		new->next = list;
-		list = new;
 	}
 out:
 	fclose(f);
@@ -826,7 +824,7 @@ out:
 err:
 	while (list) {
 		struct mount_info *next = list->next;
-		xfree(list);
+		mnt_entry_free(list);
 		list = next;
 	}
 	goto out;
-- 
1.7.11.7



More information about the CRIU mailing list