btrfs: trim: Check the range passed into to prevent overflow

Normally the range->len is set to default value (U64_MAX), but when it's
not default value, we should check if the range overflows.

And if it overflows, return -EINVAL before doing anything.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by Qu Wenruo and committed by David Sterba 07301df7 d7cd4dd9

Changed files
+11 -3
fs
+11 -3
fs/btrfs/extent-tree.c
··· 8966 8966 struct btrfs_device *device; 8967 8967 struct list_head *devices; 8968 8968 u64 group_trimmed; 8969 + u64 range_end = U64_MAX; 8969 8970 u64 start; 8970 8971 u64 end; 8971 8972 u64 trimmed = 0; ··· 8976 8975 int dev_ret = 0; 8977 8976 int ret = 0; 8978 8977 8978 + /* 8979 + * Check range overflow if range->len is set. 8980 + * The default range->len is U64_MAX. 8981 + */ 8982 + if (range->len != U64_MAX && 8983 + check_add_overflow(range->start, range->len, &range_end)) 8984 + return -EINVAL; 8985 + 8979 8986 cache = btrfs_lookup_first_block_group(fs_info, range->start); 8980 8987 for (; cache; cache = next_block_group(cache)) { 8981 - if (cache->key.objectid >= (range->start + range->len)) { 8988 + if (cache->key.objectid >= range_end) { 8982 8989 btrfs_put_block_group(cache); 8983 8990 break; 8984 8991 } 8985 8992 8986 8993 start = max(range->start, cache->key.objectid); 8987 - end = min(range->start + range->len, 8988 - cache->key.objectid + cache->key.offset); 8994 + end = min(range_end, cache->key.objectid + cache->key.offset); 8989 8995 8990 8996 if (end - start >= range->minlen) { 8991 8997 if (!block_group_cache_done(cache)) {