Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e34c330d authored by Zhao Lei's avatar Zhao Lei Committed by Chris Mason
Browse files

Btrfs: fix a out-of-bound access of raid_map



We add the number of stripes on target devices into bbio->num_stripes
if we are under device replacement, and we just sort the raid_map of
those stripes that not on the target devices, so if when we need
real raid_map, we need skip the stripes on the target devices.

Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent df8d116f
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1299,7 +1299,9 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check)
static inline int scrub_nr_raid_mirrors(struct btrfs_bio *bbio, u64 *raid_map)
{
	if (raid_map) {
		if (raid_map[bbio->num_stripes - 1] == RAID6_Q_STRIPE)
		int real_stripes = bbio->num_stripes - bbio->num_tgtdevs;

		if (raid_map[real_stripes - 1] == RAID6_Q_STRIPE)
			return 3;
		else
			return 2;
@@ -1420,7 +1422,8 @@ static int scrub_setup_recheck_block(struct scrub_ctx *sctx,

			scrub_stripe_index_and_offset(logical, raid_map,
						      mapped_length,
						      bbio->num_stripes,
						      bbio->num_stripes -
						      bbio->num_tgtdevs,
						      mirror_index,
						      &stripe_index,
						      &stripe_offset);