Theodore Ts'o 5354b2af34 ext4: allow ext4_get_group_info() to fail
Previously, ext4_get_group_info() would treat an invalid group number
as BUG(), since in theory it should never happen.  However, if a
malicious attaker (or fuzzer) modifies the superblock via the block
device while it is the file system is mounted, it is possible for
s_first_data_block to get set to a very large number.  In that case,
when calculating the block group of some block number (such as the
starting block of a preallocation region), could result in an
underflow and very large block group number.  Then the BUG_ON check in
ext4_get_group_info() would fire, resutling in a denial of service
attack that can be triggered by root or someone with write access to
the block device.

For a quality of implementation perspective, it's best that even if
the system administrator does something that they shouldn't, that it
will not trigger a BUG.  So instead of BUG'ing, ext4_get_group_info()
will call ext4_error and return NULL.  We also add fallback code in
all of the callers of ext4_get_group_info() that it might NULL.

Also, since ext4_get_group_info() was already borderline to be an
inline function, un-inline it.  The results in a next reduction of the
compiled text size of ext4 by roughly 2k.

Cc: stable@kernel.org
Link: https://lore.kernel.org/r/20230430154311.579720-2-tytso@mit.edu
Reported-by: syzbot+e2efa3efc15a1c9e95c3@syzkaller.appspotmail.com
Link: https://syzkaller.appspot.com/bug?id=69b28112e098b070f639efb356393af3ffec4220
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
2023-05-13 18:02:46 -04:00
..
2023-05-05 19:12:01 -07:00
2023-02-20 14:10:36 -08:00
2023-04-26 09:13:44 -07:00
2023-05-05 04:29:58 -05:00
2023-04-27 16:52:33 -07:00
2023-02-27 10:04:49 -08:00
2023-04-26 16:07:23 -07:00
2023-04-24 14:25:39 -07:00
2023-03-01 08:42:27 -08:00
\n
2023-04-26 09:07:46 -07:00
2023-04-26 09:42:10 -07:00
2023-04-27 11:53:57 -07:00
2023-04-26 09:28:15 -07:00
2023-04-29 10:35:48 -07:00
2023-04-24 19:20:27 -07:00
2023-04-27 11:53:57 -07:00
2023-04-29 11:04:14 -07:00
2023-04-29 11:04:14 -07:00
2023-04-03 11:16:57 +02:00
2023-04-29 10:52:37 -07:00
2023-04-27 17:03:40 -07:00
2023-03-14 12:56:30 -06:00
\n
2023-04-26 09:07:46 -07:00
2023-03-12 20:03:41 -04:00
2023-04-29 10:44:27 -07:00
2023-03-30 08:51:48 +02:00
2023-04-08 13:45:37 -07:00
2023-04-05 18:06:23 -07:00
2022-10-10 19:45:17 -07:00
2023-04-28 15:57:53 -07:00
2023-02-20 11:53:11 -08:00
2023-05-06 08:28:58 -07:00
2022-10-10 14:21:11 -07:00
2023-01-19 09:24:30 +01:00
2023-04-24 19:14:20 -07:00
2023-04-25 14:08:59 -06:00
2023-04-06 14:53:38 +02:00
2023-03-06 09:59:20 +01:00
2023-05-06 08:15:20 -07:00
2023-02-20 11:53:11 -08:00
2023-02-20 11:53:11 -08:00
2023-03-06 09:59:20 +01:00