Skip to content

Commit

Permalink
libext2fs: always refuse to open a file system with a zero s_desc_size
Browse files Browse the repository at this point in the history
Commit 42c11ed ("ext2fs_open[2](), return an error if s_desc_size
is too large") added a check for an insanely large s_desc_size to
prevent some failures triggered by fuzz testing.  However, it would
allow e2fsck to fall back to recover the file system by using the
backup superblocks by having e2fsck pass the flag
EXT2_FLAG_IGNORE_SB_ERRORS.  But by allowing an s_desc_Size of zero,
it's possible that e2fsck will die with a division of zero error.
With this fix, e2fsck will now print an error message and exit
instead.

#183

Fixes: 42c11ed ("ext2fs_open[2](), return an error if s_desc_size is too large")
Signed-off-by: Theodore Ts'o <[email protected]>
  • Loading branch information
tytso committed Apr 4, 2024
1 parent 72e3062 commit ef4e082
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 5 deletions.
11 changes: 6 additions & 5 deletions lib/ext2fs/openfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,13 +330,14 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
}

/* Enforce the block group descriptor size */
if (!(flags & EXT2_FLAG_IGNORE_SB_ERRORS) &&
ext2fs_has_feature_64bit(fs->super)) {
if (ext2fs_has_feature_64bit(fs->super)) {
unsigned desc_size = fs->super->s_desc_size;

if ((desc_size < EXT2_MIN_DESC_SIZE_64BIT) ||
(desc_size > EXT2_MAX_DESC_SIZE) ||
(desc_size & (desc_size - 1)) != 0) {
if (desc_size == 0 ||
(!(flags & EXT2_FLAG_IGNORE_SB_ERRORS) &&
((desc_size > EXT2_MAX_DESC_SIZE) ||
(desc_size < EXT2_MIN_DESC_SIZE_64BIT) ||
(desc_size & (desc_size - 1)) != 0))) {
retval = EXT2_ET_BAD_DESC_SIZE;
goto cleanup;
}
Expand Down
13 changes: 13 additions & 0 deletions tests/f_desc_size_zero/expect.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
../e2fsck/e2fsck: Block group descriptor size incorrect while trying to open test.img
../e2fsck/e2fsck: Trying to load superblock despite errors...
../e2fsck/e2fsck: Block group descriptor size incorrect while trying to open test.img

The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem. If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
or
e2fsck -b 32768 <device>

Exit status is 8
Binary file added tests/f_desc_size_zero/image.gz
Binary file not shown.
1 change: 1 addition & 0 deletions tests/f_desc_size_zero/name
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
zero s_desc_size
2 changes: 2 additions & 0 deletions tests/f_desc_size_zero/script
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ONE_PASS_ONLY="true"
. $cmd_dir/run_e2fsck

0 comments on commit ef4e082

Please sign in to comment.