btrfs-progs: don't leak in set_extent_bits
authorZach Brown <zab@redhat.com>
Wed, 23 Jan 2013 20:18:32 +0000 (12:18 -0800)
committerZach Brown <zab@redhat.com>
Wed, 6 Feb 2013 00:09:40 +0000 (16:09 -0800)
It looks possible to hit the search_again label without using the
prealloc.  A new prealloc is allocated, leaking the current one.

Every use of prealloc sets it to null so let's just allocate a new
prealloc when we don't already have one.

Signed-off-by: Zach Brown <zab@redhat.com>
extent_io.c

index ebb35b28c44e98547adc2d61877686e8b29419fb..d59f20704f2195d736393771843f3476820bae89 100644 (file)
@@ -300,9 +300,11 @@ int set_extent_bits(struct extent_io_tree *tree, u64 start,
        u64 last_start;
        u64 last_end;
 again:
-       prealloc = alloc_extent_state();
-       if (!prealloc)
-               return -ENOMEM;
+       if (!prealloc) {
+               prealloc = alloc_extent_state();
+               if (!prealloc)
+                       return -ENOMEM;
+       }
 
        /*
         * this search will find the extents that end after