From 16b8db49fee91417aad09aaa98edd3acd9e70754 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 2 Jan 2012 14:16:15 +0100 Subject: libmount; fix possible mem-leak Signed-off-by: Karel Zak --- libmount/src/tab.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'libmount/src/tab.c') diff --git a/libmount/src/tab.c b/libmount/src/tab.c index 8b708112d..15e20f8f6 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -731,19 +731,23 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb, if (tb && (mountflags & MS_BIND)) { const char *src, *src_root; + char *xsrc = NULL; DBG(TAB, mnt_debug("fs-root for bind")); - src = mnt_resolve_spec(mnt_fs_get_source(fs), tb->cache); - if (!src) - goto err; + src = xsrc = mnt_resolve_spec(mnt_fs_get_source(fs), tb->cache); + if (src) + mnt = mnt_get_mountpoint(src); + if (mnt) + root = mnt_get_fs_root(src, mnt); - mnt = mnt_get_mountpoint(src); + if (xsrc && !tb->cache) { + free(xsrc); + src = NULL; + } if (!mnt) goto err; - root = mnt_get_fs_root(src, mnt); - src_fs = mnt_table_find_target(tb, mnt, MNT_ITER_BACKWARD); if (!src_fs) { DBG(TAB, mnt_debug("not found '%s' in mountinfo -- using default", mnt)); @@ -827,6 +831,7 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) char *root = NULL; struct libmnt_fs *src_fs; const char *src, *tgt; + char *xsrc; int flags = 0, rc = 0; assert(tb); @@ -844,7 +849,8 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) else if (fstab_fs->flags & MNT_FS_PSEUDO) src = mnt_fs_get_source(fstab_fs); else - src = mnt_resolve_spec(mnt_fs_get_source(fstab_fs), tb->cache); + src = xsrc = mnt_resolve_spec(mnt_fs_get_source(fstab_fs), + tb->cache); tgt = mnt_fs_get_target(fstab_fs); @@ -873,6 +879,9 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) rc = 1; /* success */ } + if (xsrc && !tb->cache) + free(xsrc); + free(root); return rc; } -- cgit v1.2.3-55-g7522