btrfs-progs: fix leak of "path" in btrfs_find_item() error paths
authorEryu Guan <guaneryu@gmail.com>
Mon, 19 Oct 2015 11:37:50 +0000 (19:37 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 2 Nov 2015 08:35:02 +0000 (09:35 +0100)
path needs to be freed before return.

Signed-off-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
ctree.c

diff --git a/ctree.c b/ctree.c
index e6e5689..1434007 100644 (file)
--- a/ctree.c
+++ b/ctree.c
@@ -1058,26 +1058,28 @@ int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *found_path,
                path = found_path;
 
        ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
-       if ((ret < 0) || (found_key == NULL)) {
-               if (path != found_path)
-                       btrfs_free_path(path);
-               return ret;
-       }
+       if ((ret < 0) || (found_key == NULL))
+               goto out;
 
        eb = path->nodes[0];
        if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
                ret = btrfs_next_leaf(fs_root, path);
                if (ret)
-                       return ret;
+                       goto out;
                eb = path->nodes[0];
        }
 
        btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
        if (found_key->type != key.type ||
-                       found_key->objectid != key.objectid)
-               return 1;
+                       found_key->objectid != key.objectid) {
+               ret = 1;
+               goto out;
+       }
 
-       return 0;
+out:
+       if (path != found_path)
+               btrfs_free_path(path);
+       return ret;
 }
 
 /*