From: Colin Ian King <[email protected]>
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: 62f7b1989c02 ("md raid0/linear: Mark array as 'broken' and fail BIOs if a member is gone")
Signed-off-by: Colin Ian King <[email protected]>
---
drivers/md/md.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 8bb69c61afe0..49452149ac72 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -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;
--
2.27.0
Great catch Colin, thanks!
Feel free to add my:
Reviewed-by: Guilherme G. Piccoli <[email protected]>
P.S. Not sure if it's only me, but the diff is soo much easier to
read when git is set to use patience diff algorithm:
https://termbin.com/f8ig
On Thu, Jul 2, 2020 at 7:41 AM Guilherme Piccoli <[email protected]> wrote:
>
> Great catch Colin, thanks!
> Feel free to add my:
>
> Reviewed-by: Guilherme G. Piccoli <[email protected]>
Thanks Colin and Guilherme! Applied to md-next.
>
>
> P.S. Not sure if it's only me, but the diff is soo much easier to
> read when git is set to use patience diff algorithm:
> https://termbin.com/f8ig
Agreed. Patience is cleaner.