aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2015-01-02 12:45:16 -0500
committerDavid Sterba <dsterba@suse.cz>2015-01-14 13:23:46 -0500
commit381cf6587f8a8a8e981bc0c1aaaa8859b51dc756 (patch)
tree024b49bf7f036ff79846076c44710337bd0d5ec1 /fs/btrfs/disk-io.c
parenteaa27f34e91a14cdceed26ed6c6793ec1d186115 (diff)
btrfs: fix leak of path in btrfs_find_item
If btrfs_find_item is called with NULL path it allocates one locally but does not free it. Affected paths are inserting an orphan item for a file and for a subvol root. Move the path allocation to the callers. CC: <stable@vger.kernel.org> # 3.14+ Fixes: 3f870c289900 ("btrfs: expand btrfs_find_item() to include find_orphan_item functionality") Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 8c63419a7f70..6182e5493d0f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1630,6 +1630,7 @@ struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
1630 bool check_ref) 1630 bool check_ref)
1631{ 1631{
1632 struct btrfs_root *root; 1632 struct btrfs_root *root;
1633 struct btrfs_path *path;
1633 int ret; 1634 int ret;
1634 1635
1635 if (location->objectid == BTRFS_ROOT_TREE_OBJECTID) 1636 if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
@@ -1669,8 +1670,14 @@ again:
1669 if (ret) 1670 if (ret)
1670 goto fail; 1671 goto fail;
1671 1672
1672 ret = btrfs_find_item(fs_info->tree_root, NULL, BTRFS_ORPHAN_OBJECTID, 1673 path = btrfs_alloc_path();
1674 if (!path) {
1675 ret = -ENOMEM;
1676 goto fail;
1677 }
1678 ret = btrfs_find_item(fs_info->tree_root, path, BTRFS_ORPHAN_OBJECTID,
1673 location->objectid, BTRFS_ORPHAN_ITEM_KEY, NULL); 1679 location->objectid, BTRFS_ORPHAN_ITEM_KEY, NULL);
1680 btrfs_free_path(path);
1674 if (ret < 0) 1681 if (ret < 0)
1675 goto fail; 1682 goto fail;
1676 if (ret == 0) 1683 if (ret == 0)