Commit 6a49f82f authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

mount: free all parts of mnt entries

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: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent edc86536
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment