Commit 9a5a8597 authored by Colin Ian King's avatar Colin Ian King Committed by Song Liu
Browse files

md: raid0/linear: fix dereference before null check on pointer mddev



Pointer mddev is being dereferenced with a test_bit call before mddev
is being null checked, this may cause a null pointer dereference. Fix
this by moving the null pointer checks to sanity check mddev before
it is dereferenced.

Addresses-Coverity: ("Dereference before null check")
Fixes: 62f7b198 ("md raid0/linear: Mark array as 'broken' and fail BIOs if a member is gone")
Signed-off-by: default avatarColin Ian King <colin.king@canonical.com>
Reviewed-by: default avatarGuilherme G. Piccoli <gpiccoli@canonical.com>
Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
parent 2eaac320
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -470,17 +470,18 @@ static blk_qc_t md_submit_bio(struct bio *bio)
	struct mddev *mddev = bio->bi_disk->private_data;
	unsigned int sectors;

	if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) {
	if (mddev == NULL || mddev->pers == NULL) {
		bio_io_error(bio);
		return BLK_QC_T_NONE;
	}

	blk_queue_split(&bio);

	if (mddev == NULL || mddev->pers == NULL) {
	if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) {
		bio_io_error(bio);
		return BLK_QC_T_NONE;
	}

	blk_queue_split(&bio);

	if (mddev->ro == 1 && unlikely(rw == WRITE)) {
		if (bio_sectors(bio) != 0)
			bio->bi_status = BLK_STS_IOERR;