linux/fs/ext4
Eryu Guan cde863587b ext4: validate s_first_meta_bg at mount time
commit 3a4b77cd47 upstream.

Ralf Spenneberg reported that he hit a kernel crash when mounting a
modified ext4 image. And it turns out that kernel crashed when
calculating fs overhead (ext4_calculate_overhead()), this is because
the image has very large s_first_meta_bg (debug code shows it's
842150400), and ext4 overruns the memory in count_overhead() when
setting bitmap buffer, which is PAGE_SIZE.

ext4_calculate_overhead():
  buf = get_zeroed_page(GFP_NOFS);  <=== PAGE_SIZE buffer
  blks = count_overhead(sb, i, buf);

count_overhead():
  for (j = ext4_bg_num_gdb(sb, grp); j > 0; j--) { <=== j = 842150400
          ext4_set_bit(EXT4_B2C(sbi, s++), buf);   <=== buffer overrun
          count++;
  }

This can be reproduced easily for me by this script:

  #!/bin/bash
  rm -f fs.img
  mkdir -p /mnt/ext4
  fallocate -l 16M fs.img
  mke2fs -t ext4 -O bigalloc,meta_bg,^resize_inode -F fs.img
  debugfs -w -R "ssv first_meta_bg 842150400" fs.img
  mount -o loop fs.img /mnt/ext4

Fix it by validating s_first_meta_bg first at mount time, and
refusing to mount if its value exceeds the largest possible meta_bg
number.

Reported-by: Ralf Spenneberg <ralf@os-t.de>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
[bwh: Backported to 3.16: use EXT4_HAS_INCOMPAT_FEATURE()]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2017-02-26 20:01:49 +00:00
..
acl.c posix_acl: Clear SGID bit when setting file permissions 2016-11-20 01:17:38 +00:00
acl.h ext2/3/4: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
balloc.c ext4: validate s_reserved_gdt_blocks on mount 2016-11-20 01:16:46 +00:00
bitmap.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
block_validity.c fs/ext4: use rbtree postorder iteration helper instead of opencoding 2014-01-23 16:37:03 -08:00
dir.c ext4: remove unused local variable "stored" from ext4_readdir(...) 2014-05-27 12:48:55 -04:00
ext4.h ext4: sanity check the block and cluster size at mount time 2017-02-23 03:54:38 +00:00
ext4_extents.h ext4: rename uninitialized extents to unwritten 2014-04-20 23:45:47 -04:00
ext4_jbd2.c ext4: fix potential use after free in __ext4_journal_stop 2015-12-13 17:48:47 +00:00
ext4_jbd2.h ext4: make local functions static 2014-05-12 10:50:23 -04:00
extents.c ext4: check for extents that wrap around 2016-11-20 01:16:44 +00:00
extents_status.c ext4: fix data corruption caused by unwritten and delayed extents 2015-05-12 09:36:39 +01:00
extents_status.h ext4: add ext4_es_store_pblock_status() 2014-02-19 20:15:15 -05:00
file.c ext4: prevent bugon on race between write/fcntl 2014-11-13 11:48:59 +00:00
fsync.c ext4: Fix fsync error handling after filesystem abort 2013-06-12 22:38:04 -04:00
hash.c ext4: reduce one "if" comparison in ext4_dirhash() 2013-02-01 22:33:21 -05:00
ialloc.c ext4: clean up error handling when orphan list is corrupted 2016-08-22 22:37:52 +01:00
indirect.c ext4: don't retry file block mapping on bigalloc fs with non-extent file 2015-07-15 10:00:48 +01:00
inline.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
inode.c ext4: bugfix for mmaped pages in mpage_release_unused_pages() 2017-02-23 03:54:00 +00:00
ioctl.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
Kconfig ext4: fix Kconfig documentation for CONFIG_EXT4_DEBUG 2013-04-21 20:32:03 -04:00
Makefile ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
mballoc.c ext4: fix reference counting bug on block allocation error 2016-11-20 01:16:51 +00:00
mballoc.h ext4: remove unused ac_ex_scanned 2014-02-20 13:32:10 -05:00
migrate.c ext4: correctly migrate a file with a hole at the beginning 2015-07-20 14:38:52 +01:00
mmp.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
move_extent.c ext4: add lockdep annotations for i_data_sem 2016-05-01 00:06:07 +02:00
namei.c ext4: release bh in make_indexed_dir 2017-02-23 03:54:06 +00:00
page-io.c Clean ups and miscellaneous bug fixes, in particular for the new 2014-06-08 13:03:35 -07:00
resize.c ext4: fix potential integer overflow 2016-03-04 10:26:39 +00:00
super.c ext4: validate s_first_meta_bg at mount time 2017-02-26 20:01:49 +00:00
symlink.c ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
xattr.h ext4: each filesystem creates and uses its own mb_cache 2014-03-18 19:24:49 -04:00
xattr_security.c Merge branch 'for_linus' into for_linus_merged 2012-01-10 11:54:07 -05:00
xattr_trusted.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr_user.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00