btrfs: free ulist in qgroup_shared_accounting() error path
authorEric Sandeen <sandeen@redhat.com>
Thu, 12 Jun 2014 05:14:59 +0000 (00:14 -0500)
committerChris Mason <clm@fb.com>
Fri, 13 Jun 2014 16:52:26 +0000 (09:52 -0700)
If tmp = ulist_alloc(GFP_NOFS) fails, we return without
freeing the previously allocated qgroups = ulist_alloc(GFP_NOFS)
and cause a memory leak.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/qgroup.c

index cf5aead95a7f6d2eac95c3cd47fc7d56cab92e4b..98cb6b2630f9aac60972b5aea3c372e9e99eeba5 100644 (file)
@@ -1798,8 +1798,10 @@ static int qgroup_shared_accounting(struct btrfs_trans_handle *trans,
                return -ENOMEM;
 
        tmp = ulist_alloc(GFP_NOFS);
-       if (!tmp)
+       if (!tmp) {
+               ulist_free(qgroups);
                return -ENOMEM;
+       }
 
        btrfs_get_tree_mod_seq(fs_info, &elem);
        ret = btrfs_find_all_roots(trans, fs_info, oper->bytenr, elem.seq,