diff options
author | Karel Zak | 2012-01-02 14:16:15 +0100 |
---|---|---|
committer | Karel Zak | 2012-01-02 14:16:15 +0100 |
commit | 16b8db49fee91417aad09aaa98edd3acd9e70754 (patch) | |
tree | bd94b3b002967ce63d8e375a8ad5a39542e08b11 /libmount/src/tab.c | |
parent | libmount: always trust the source of a pseudofs (diff) | |
download | kernel-qcow2-util-linux-16b8db49fee91417aad09aaa98edd3acd9e70754.tar.gz kernel-qcow2-util-linux-16b8db49fee91417aad09aaa98edd3acd9e70754.tar.xz kernel-qcow2-util-linux-16b8db49fee91417aad09aaa98edd3acd9e70754.zip |
libmount; fix possible mem-leak
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src/tab.c')
-rw-r--r-- | libmount/src/tab.c | 23 |
1 files changed, 16 insertions, 7 deletions
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; } |