Skip to content

Commit

Permalink
mount: free all parts of mnt entries
Browse files Browse the repository at this point in the history
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@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
  • Loading branch information
avagin authored and xemul committed Apr 9, 2013
1 parent edc8653 commit 6a49f82
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 16 deletions.
7 changes: 2 additions & 5 deletions include/proc_parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
40 changes: 35 additions & 5 deletions mount.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -708,7 +738,7 @@ static int populate_mnt_ns(int ns_pid)
while (pms) {
struct mount_info *pm = pms;
pms = pm->next;
xfree(pm);
mnt_entry_free(pm);
}
close_safe(&img);
return -1;
Expand Down
10 changes: 4 additions & 6 deletions proc_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
Expand All @@ -826,7 +824,7 @@ struct mount_info *parse_mountinfo(pid_t pid)
err:
while (list) {
struct mount_info *next = list->next;
xfree(list);
mnt_entry_free(list);
list = next;
}
goto out;
Expand Down

0 comments on commit 6a49f82

Please sign in to comment.