Patch "xfs: fix log recovery buffer allocation for the legacy h_size fixup" 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

    xfs: fix log recovery buffer allocation for the legacy h_size fixup

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:
     xfs-fix-log-recovery-buffer-allocation-for-the-legac.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 6f069e2fd9f155e5face3c5aef5cf7bd1acf99ad
Author: Christoph Hellwig <hch@xxxxxx>
Date:   Tue Apr 30 06:07:55 2024 +0200

    xfs: fix log recovery buffer allocation for the legacy h_size fixup
    
    [ Upstream commit 45cf976008ddef4a9c9a30310c9b4fb2a9a6602a ]
    
    Commit a70f9fe52daa ("xfs: detect and handle invalid iclog size set by
    mkfs") added a fixup for incorrect h_size values used for the initial
    umount record in old xfsprogs versions.  Later commit 0c771b99d6c9
    ("xfs: clean up calculation of LR header blocks") cleaned up the log
    reover buffer calculation, but stoped using the fixed up h_size value
    to size the log recovery buffer, which can lead to an out of bounds
    access when the incorrect h_size does not come from the old mkfs
    tool, but a fuzzer.
    
    Fix this by open coding xlog_logrec_hblks and taking the fixed h_size
    into account for this calculation.
    
    Fixes: 0c771b99d6c9 ("xfs: clean up calculation of LR header blocks")
    Reported-by: Sam Sun <samsun1006219@xxxxxxxxx>
    Signed-off-by: Christoph Hellwig <hch@xxxxxx>
    Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx>
    Reviewed-by: "Darrick J. Wong" <djwong@xxxxxxxxxx>
    Signed-off-by: Chandan Babu R <chandanbabu@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index f3fcd58349c16..d6cb097f63729 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -2965,7 +2965,7 @@ xlog_do_recovery_pass(
 	int			error = 0, h_size, h_len;
 	int			error2 = 0;
 	int			bblks, split_bblks;
-	int			hblks, split_hblks, wrapped_hblks;
+	int			hblks = 1, split_hblks, wrapped_hblks;
 	int			i;
 	struct hlist_head	rhash[XLOG_RHASH_SIZE];
 	LIST_HEAD		(buffer_list);
@@ -3021,14 +3021,22 @@ xlog_do_recovery_pass(
 		if (error)
 			goto bread_err1;
 
-		hblks = xlog_logrec_hblks(log, rhead);
-		if (hblks != 1) {
-			kvfree(hbp);
-			hbp = xlog_alloc_buffer(log, hblks);
+		/*
+		 * This open codes xlog_logrec_hblks so that we can reuse the
+		 * fixed up h_size value calculated above.  Without that we'd
+		 * still allocate the buffer based on the incorrect on-disk
+		 * size.
+		 */
+		if (h_size > XLOG_HEADER_CYCLE_SIZE &&
+		    (rhead->h_version & cpu_to_be32(XLOG_VERSION_2))) {
+			hblks = DIV_ROUND_UP(h_size, XLOG_HEADER_CYCLE_SIZE);
+			if (hblks > 1) {
+				kvfree(hbp);
+				hbp = xlog_alloc_buffer(log, hblks);
+			}
 		}
 	} else {
 		ASSERT(log->l_sectBBsize == 1);
-		hblks = 1;
 		hbp = xlog_alloc_buffer(log, 1);
 		h_size = XLOG_BIG_RECORD_BSIZE;
 	}




[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