Patch "ext4: fix infinite loop when replaying fast_commit" has been added to the 6.6-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

    ext4: fix infinite loop when replaying fast_commit

to the 6.6-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:
     ext4-fix-infinite-loop-when-replaying-fast_commit.patch
and it can be found in the queue-6.6 subdirectory.

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



commit 1eca0845e51616d5db488e0f80d98813a1535b2b
Author: Luis Henriques (SUSE) <luis.henriques@xxxxxxxxx>
Date:   Wed May 15 09:28:57 2024 +0100

    ext4: fix infinite loop when replaying fast_commit
    
    [ Upstream commit 907c3fe532253a6ef4eb9c4d67efb71fab58c706 ]
    
    When doing fast_commit replay an infinite loop may occur due to an
    uninitialized extent_status struct.  ext4_ext_determine_insert_hole() does
    not detect the replay and calls ext4_es_find_extent_range(), which will
    return immediately without initializing the 'es' variable.
    
    Because 'es' contains garbage, an integer overflow may happen causing an
    infinite loop in this function, easily reproducible using fstest generic/039.
    
    This commit fixes this issue by unconditionally initializing the structure
    in function ext4_es_find_extent_range().
    
    Thanks to Zhang Yi, for figuring out the real problem!
    
    Fixes: 8016e29f4362 ("ext4: fast commit recovery path")
    Signed-off-by: Luis Henriques (SUSE) <luis.henriques@xxxxxxxxx>
    Reviewed-by: Zhang Yi <yi.zhang@xxxxxxxxxx>
    Link: https://patch.msgid.link/20240515082857.32730-1-luis.henriques@xxxxxxxxx
    Signed-off-by: Theodore Ts'o <tytso@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
index f4b50652f0cce..d9d5cfb9c951a 100644
--- a/fs/ext4/extents_status.c
+++ b/fs/ext4/extents_status.c
@@ -310,6 +310,8 @@ void ext4_es_find_extent_range(struct inode *inode,
 			       ext4_lblk_t lblk, ext4_lblk_t end,
 			       struct extent_status *es)
 {
+	es->es_lblk = es->es_len = es->es_pblk = 0;
+
 	if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
 		return;
 




[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