Patch "md/raid5-cache: fix null-ptr-deref for r5l_flush_stripe_to_raid()" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    md/raid5-cache: fix null-ptr-deref for r5l_flush_stripe_to_raid()

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     md-raid5-cache-fix-null-ptr-deref-for-r5l_flush_stri.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a810a6f44aaec84f329fde5bd469028811bd0569
Author: Yu Kuai <yukuai3@xxxxxxxxxx>
Date:   Tue Aug 8 18:49:12 2023 +0800

    md/raid5-cache: fix null-ptr-deref for r5l_flush_stripe_to_raid()
    
    [ Upstream commit 0d0bd28c500173bfca78aa840f8f36d261ef1765 ]
    
    r5l_flush_stripe_to_raid() will check if the list 'flushing_ios' is
    empty, and then submit 'flush_bio', however, r5l_log_flush_endio()
    is clearing the list first and then clear the bio, which will cause
    null-ptr-deref:
    
    T1: submit flush io
    raid5d
     handle_active_stripes
      r5l_flush_stripe_to_raid
       // list is empty
       // add 'io_end_ios' to the list
       bio_init
       submit_bio
       // io1
    
    T2: io1 is done
    r5l_log_flush_endio
     list_splice_tail_init
     // clear the list
                            T3: submit new flush io
                            ...
                            r5l_flush_stripe_to_raid
                             // list is empty
                             // add 'io_end_ios' to the list
                             bio_init
     bio_uninit
     // clear bio->bi_blkg
                             submit_bio
                             // null-ptr-deref
    
    Fix this problem by clearing bio before clearing the list in
    r5l_log_flush_endio().
    
    Fixes: 0dd00cba99c3 ("raid5-cache: fully initialize flush_bio when needed")
    Reported-and-tested-by: Corey Hickey <bugfood-ml@xxxxxxxxxx>
    Closes: https://lore.kernel.org/all/cddd7213-3dfd-4ab7-a3ac-edd54d74a626@xxxxxxxxxx/
    Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx>
    Reviewed-by: Christoph Hellwig <hch@xxxxxx>
    Signed-off-by: Song Liu <song@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 477e3ae17545a..eb66d0bfe39d2 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -1260,14 +1260,13 @@ static void r5l_log_flush_endio(struct bio *bio)
 
 	if (bio->bi_status)
 		md_error(log->rdev->mddev, log->rdev);
+	bio_uninit(bio);
 
 	spin_lock_irqsave(&log->io_list_lock, flags);
 	list_for_each_entry(io, &log->flushing_ios, log_sibling)
 		r5l_io_run_stripes(io);
 	list_splice_tail_init(&log->flushing_ios, &log->finished_ios);
 	spin_unlock_irqrestore(&log->io_list_lock, flags);
-
-	bio_uninit(bio);
 }
 
 /*



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux