]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount; fix possible mem-leak
authorKarel Zak <kzak@redhat.com>
Mon, 2 Jan 2012 13:16:15 +0000 (14:16 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 2 Jan 2012 13:16:15 +0000 (14:16 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/fs.c
libmount/src/tab.c

index 26560d161a5bb1d813e47ac2a259753cece55606..90f484beccf2e555b195d16196ae353f1113e94f 100644 (file)
@@ -1081,7 +1081,8 @@ int mnt_fs_get_attribute(struct libmnt_fs *fs, const char *name,
  *
  * Returns: 1 if @fs target is equal to @target else 0.
  */
-int mnt_fs_match_target(struct libmnt_fs *fs, const char *target, struct libmnt_cache *cache)
+int mnt_fs_match_target(struct libmnt_fs *fs, const char *target,
+                       struct libmnt_cache *cache)
 {
        int rc = 0;
 
@@ -1127,7 +1128,8 @@ int mnt_fs_match_target(struct libmnt_fs *fs, const char *target, struct libmnt_
  *
  * Returns: 1 if @fs source is equal to @source else 0.
  */
-int mnt_fs_match_source(struct libmnt_fs *fs, const char *source, struct libmnt_cache *cache)
+int mnt_fs_match_source(struct libmnt_fs *fs, const char *source,
+                       struct libmnt_cache *cache)
 {
        char *cn;
        const char *src, *t, *v;
index 8b708112d56ef7c62f031d835ff68b26c2ab4d76..15e20f8f6cc56c7b41c1eab8b025ff9c6cde7f07 100644 (file)
@@ -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;
 }