btrfs-progs: free memory before error exit in read_whole_eb
authorEric Sandeen <sandeen@redhat.com>
Mon, 25 Feb 2013 22:54:42 +0000 (16:54 -0600)
committerDavid Sterba <dsterba@suse.cz>
Wed, 27 Feb 2013 13:39:42 +0000 (14:39 +0100)
Free the memory allocated to "multi" before the error
exit in read_whole_eb().  Set it to NULL after we free
it in the loop to avoid any potential double-free.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
disk-io.c

index 5aa9aa3a4093161bd7e02b628ed1853a3f2c1926..897d0cf0b8b67f615847b432245f42502b1de9e8 100644 (file)
--- a/disk-io.c
+++ b/disk-io.c
@@ -198,17 +198,21 @@ static int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, i
                                      mirror, NULL);
                if (ret) {
                        printk("Couldn't map the block %Lu\n", eb->start + offset);
+                       kfree(multi);
                        return -EIO;
                }
                device = multi->stripes[0].dev;
 
-               if (device->fd == 0)
+               if (device->fd == 0) {
+                       kfree(multi);
                        return -EIO;
+               }
 
                eb->fd = device->fd;
                device->total_ios++;
                eb->dev_bytenr = multi->stripes[0].physical;
                kfree(multi);
+               multi = NULL;
 
                if (read_len > bytes_left)
                        read_len = bytes_left;