btrfs: fix int32 overflow in shrink_delalloc().
authorAdam Borowski <kilobyte@angband.pl>
Sun, 8 May 2016 13:08:00 +0000 (15:08 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 9 May 2016 09:51:19 +0000 (11:51 +0200)
UBSAN: Undefined behaviour in fs/btrfs/extent-tree.c:4623:21
signed integer overflow:
10808 * 262144 cannot be represented in type 'int [8]'

If 8192<=items<16384, we request a writeback of an insane number of pages
which is benign (everything will be written).  But if items>=16384, the
space reservation won't be enough.

Signed-off-by: Adam Borowski <kilobyte@angband.pl>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index 84e060eb0de8c6aca562bcfb537f5236a71e9e66..391f576789e96d8caf262da107b42b8cc438924a 100644 (file)
@@ -4620,7 +4620,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig,
 
        /* Calc the number of the pages we need flush for space reservation */
        items = calc_reclaim_items_nr(root, to_reclaim);
-       to_reclaim = items * EXTENT_SIZE_PER_ITEM;
+       to_reclaim = (u64)items * EXTENT_SIZE_PER_ITEM;
 
        trans = (struct btrfs_trans_handle *)current->journal_info;
        block_rsv = &root->fs_info->delalloc_block_rsv;