Blame SOURCES/e2fsprogs-1.45.6-libext2fs-add-sanity-check-to-extent-manipulation.patch

f239de
From 265fcf9204fd06f574578ebe780f24e62bac2e86 Mon Sep 17 00:00:00 2001
f239de
From: Lukas Czerner <lczerner@redhat.com>
f239de
Date: Thu, 21 Apr 2022 19:31:48 +0200
f239de
Subject: [PATCH 1/2] libext2fs: add sanity check to extent manipulation
f239de
Content-Type: text/plain
f239de
f239de
It is possible to have a corrupted extent tree in such a way that a leaf
f239de
node contains zero extents in it. Currently if that happens and we try
f239de
to traverse the tree we can end up accessing wrong data, or possibly
f239de
even uninitialized memory. Make sure we don't do that.
f239de
f239de
Additionally make sure that we have a sane number of bytes passed to
f239de
memmove() in ext2fs_extent_delete().
f239de
f239de
Note that e2fsck is currently unable to spot and fix such corruption in
f239de
pass1.
f239de
f239de
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
f239de
Reported-by: Nils Bars <nils_bars@t-online.de>
f239de
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2068113
f239de
Addresses: CVE-2022-1304
f239de
Addresses-Debian-Bug: #1010263
f239de
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
f239de
---
f239de
 lib/ext2fs/extent.c | 8 ++++++++
f239de
 1 file changed, 8 insertions(+)
f239de
f239de
diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c
f239de
index ac3dbfec..a1b1905c 100644
f239de
--- a/lib/ext2fs/extent.c
f239de
+++ b/lib/ext2fs/extent.c
f239de
@@ -495,6 +495,10 @@ retry:
f239de
 			ext2fs_le16_to_cpu(eh->eh_entries);
f239de
 		newpath->max_entries = ext2fs_le16_to_cpu(eh->eh_max);
f239de
 
f239de
+		/* Make sure there is at least one extent present */
f239de
+		if (newpath->left <= 0)
f239de
+			return EXT2_ET_EXTENT_NO_DOWN;
f239de
+
f239de
 		if (path->left > 0) {
f239de
 			ix++;
f239de
 			newpath->end_blk = ext2fs_le32_to_cpu(ix->ei_block);
f239de
@@ -1630,6 +1634,10 @@ errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags)
f239de
 
f239de
 	cp = path->curr;
f239de
 
f239de
+	/* Sanity check before memmove() */
f239de
+	if (path->left < 0)
f239de
+		return EXT2_ET_EXTENT_LEAF_BAD;
f239de
+
f239de
 	if (path->left) {
f239de
 		memmove(cp, cp + sizeof(struct ext3_extent_idx),
f239de
 			path->left * sizeof(struct ext3_extent_idx));
f239de
-- 
f239de
2.35.1
f239de