Btrfs: free nce and nce_head on error in name_cache_insert
authorAlexander Block <ablock84@googlemail.com>
Wed, 1 Aug 2012 10:07:43 +0000 (12:07 +0200)
committerChris Mason <chris.mason@fusionio.com>
Mon, 1 Oct 2012 19:18:56 +0000 (15:18 -0400)
Both were leaked in case of error.

Reported-by: Alex Lyakas <alex.bolshoy.btrfs@gmail.com>
Signed-off-by: Alexander Block <ablock84@googlemail.com>
fs/btrfs/send.c

index b0f9df30f24d50e220d8b0257405e89cc95e3853..cfbe987f854bddeef04d3ff774c4562f1a404b78 100644 (file)
@@ -1759,6 +1759,7 @@ out:
  * Insert a name cache entry. On 32bit kernels the radix tree index is 32bit,
  * so we need to do some special handling in case we have clashes. This function
  * takes care of this with the help of name_cache_entry::radix_list.
+ * In case of error, nce is kfreed.
  */
 static int name_cache_insert(struct send_ctx *sctx,
                             struct name_cache_entry *nce)
@@ -1775,8 +1776,11 @@ static int name_cache_insert(struct send_ctx *sctx,
                INIT_LIST_HEAD(nce_head);
 
                ret = radix_tree_insert(&sctx->name_cache, nce->ino, nce_head);
-               if (ret < 0)
+               if (ret < 0) {
+                       kfree(nce_head);
+                       kfree(nce);
                        return ret;
+               }
        }
        list_add_tail(&nce->radix_list, nce_head);
        list_add_tail(&nce->list, &sctx->name_cache_list);