btrfs: Fix bound checking in qgroup_trace_new_subtree_blocks

If 'cur_level' is 7  then the bound checking at the top of the function
will actually pass. Later on, it's possible to dereference
ds_path->nodes[cur_level+1] which will be an out of bounds.

The correct check will be cur_level >= BTRFS_MAX_LEVEL - 1 .

Fixes-coverty-id: 1440918
Fixes-coverty-id: 1440911
Fixes: ea49f3e73c ("btrfs: qgroup: Introduce function to find all new tree blocks of reloc tree")
CC: stable@vger.kernel.org # 4.20+
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Nikolay Borisov 2019-03-18 17:45:19 +02:00 committed by David Sterba
parent 3897b6f0a8
commit 7ff2c2a1a7
1 changed files with 2 additions and 2 deletions

View File

@ -1922,8 +1922,8 @@ static int qgroup_trace_new_subtree_blocks(struct btrfs_trans_handle* trans,
int i; int i;
/* Level sanity check */ /* Level sanity check */
if (cur_level < 0 || cur_level >= BTRFS_MAX_LEVEL || if (cur_level < 0 || cur_level >= BTRFS_MAX_LEVEL - 1 ||
root_level < 0 || root_level >= BTRFS_MAX_LEVEL || root_level < 0 || root_level >= BTRFS_MAX_LEVEL - 1 ||
root_level < cur_level) { root_level < cur_level) {
btrfs_err_rl(fs_info, btrfs_err_rl(fs_info,
"%s: bad levels, cur_level=%d root_level=%d", "%s: bad levels, cur_level=%d root_level=%d",