Skip to contentSkip to conversation

Patch "ext4: check for extents that wrap around" has been added to the 4.4-stable tree

PATCH [email protected] 1 participant 1 message Aug 14, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

ext4: check for extents that wrap around

to the 4.4-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-check-for-extents-that-wrap-around.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From f70749ca42943faa4d4dcce46dfdcaadb1d0c4b6 Mon Sep 17 00:00:00 2001

From: Vegard Nossum <[email protected]>
Date: Thu, 30 Jun 2016 11:53:46 -0400
Subject: ext4: check for extents that wrap around

From: Vegard Nossum <[email protected]>

commit f70749ca42943faa4d4dcce46dfdcaadb1d0c4b6 upstream.

An extent with lblock = 4294967295 and len = 1 will pass the ext4_valid_extent() test:

	ext4_lblk_t last = lblock + len - 1;

	if (len == 0 || lblock > last)
		return 0;

since last = 4294967295 + 1 - 1 = 4294967295. This would later trigger the BUG_ON(es->es_lblk + es->es_len < es->es_lblk) in ext4_es_end().

We can simplify it by removing the - 1 altogether and changing the test to use lblock + len <= lblock, since now if len = 0, then lblock + 0 == lblock and it fails, and if len > 0 then lblock + len > lblock in order to pass (i.e. it doesn't overflow).

Fixes 5946d0893 ("ext4: check for overlapping extents in ext4_valid_extent_entries()")
Fixes 2f974865f ("ext4: check for zero length extent explicitly")
Cc Eryu Guan <[email protected]>
---
 fs/ext4/extents.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
fs/ext4/extents.c +6 -2
@@ -376,9 +376,13 @@ static int ext4_valid_extent(struct inod
 	ext4_fsblk_t block = ext4_ext_pblock(ext);
 	int len = ext4_ext_get_actual_len(ext);
 	ext4_lblk_t lblock = le32_to_cpu(ext->ee_block);
-	ext4_lblk_t last = lblock + len - 1;
 
-	if (len == 0 || lblock > last)
+	/*
+	 * We allow neither:
+	 *  - zero length
+	 *  - overflow/wrap-around
+	 */
+	if (lblock + len <= lblock)
 		return 0;
 	return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len);
 }

Patches currently in stable-queue which might be from [email protected] are

queue-4.4/ext4-short-cut-orphan-cleanup-on-error.patch queue-4.4/block-fix-use-after-free-in-seq-file.patch queue-4.4/ipv4-reject-rtnh_f_dead-and-rtnh_f_linkdown-from-user-space.patch queue-4.4/ext4-check-for-extents-that-wrap-around.patch queue-4.4/net-irda-fix-null-pointer-dereference-on-memory-allocation-failure.patch queue-4.4/ext4-validate-s_reserved_gdt_blocks-on-mount.patch queue-4.4/ext4-don-t-call-ext4_should_journal_data-on-the-journal-inode.patch