[parted-devel] [PATCH] nilfs2: Fixed possible sigsegv in case of corrupted superblock

Brian C. Lane bcl at redhat.com
Wed May 28 21:54:55 BST 2025


From: Anton Butenko <abutenko at akamai.com>

bytes value comes from the superblock and it must be at least as long as
s_sum which is a 32 bit value. So sumoff + 4 is the correct lower limit
for it, not sumoff - 4.

Signed-off-by: Brian C. Lane <bcl at redhat.com>
---
 libparted/fs/nilfs2/nilfs2.c |  2 +-
 tests/t4301-nilfs2-badsb2.sh | 10 ++++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/libparted/fs/nilfs2/nilfs2.c b/libparted/fs/nilfs2/nilfs2.c
index 40f8567..74186f1 100644
--- a/libparted/fs/nilfs2/nilfs2.c
+++ b/libparted/fs/nilfs2/nilfs2.c
@@ -88,7 +88,7 @@ is_valid_nilfs_sb(struct nilfs2_super_block *sb)
 		return 0;
 
 	bytes = PED_LE16_TO_CPU(sb->s_bytes);
-	if (bytes > 1024 || bytes < sumoff - 4)
+	if (bytes > 1024 || bytes < sumoff + 4)
 		return 0;
 
 	crc = __efi_crc32(sb, sumoff, PED_LE32_TO_CPU(sb->s_crc_seed));
diff --git a/tests/t4301-nilfs2-badsb2.sh b/tests/t4301-nilfs2-badsb2.sh
index 2a1205b..45b6644 100755
--- a/tests/t4301-nilfs2-badsb2.sh
+++ b/tests/t4301-nilfs2-badsb2.sh
@@ -27,16 +27,22 @@ end=$(($len * 512 / $ss))
 parted -s $dev mklabel msdos mkpart primary 1s ${end}s || framework_failure_
 
 # Write a secondary superblock with the nilfs magic number and a nilfs
-# superblock length (s_bytes) field of only 10 bytes.
+# superblock length (s_bytes) field of only 13 bytes.
 # struct nilfs2_super_block starts with these four fields...
 #	uint32_t	s_rev_level;
 #	uint16_t	s_minor_rev_level;
 #	uint16_t	s_magic;
 #	uint16_t	s_bytes;
 sb2_offset=$(( 24 / ($ss / 512) + 1))
-perl -e "print pack 'LSSS.', 0, 0, 0x3434, 10, $ss" |
+perl -e "print pack 'LSSS.', 0, 0, 0x3434, 13, $ss" |
     dd of=$dev bs=$ss seek=$sb2_offset count=1 conv=notrunc
 
+# Write primary nilfs magic number and a nilfs
+# superblock length (s_bytes) field of only 13 bytes.
+sb_offset=3
+perl -e "print pack 'LSSS.', 0, 0, 0x3434, 13, $ss" |
+    dd of=$dev bs=$ss seek=$sb_offset count=1 conv=notrunc
+
 # This used to give parted a sigsegv.
 parted -s $dev print || fail=1
 
-- 
2.49.0




More information about the parted-devel mailing list