All of lore.kernel.org
 help / color / mirror / Atom feed
* general protection fault in bdev_read_page
@ 2021-11-18 23:08 Tadeusz Struk
  2021-11-18 23:57 ` [PATCH 5.15] block: Add a helper to validate the block size Tadeusz Struk
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Tadeusz Struk @ 2021-11-18 23:08 UTC (permalink / raw)
  To: stable
  Cc: syzbot+662448179365dddc1880, linux-block, linux-kernel,
	xieyongji, Christoph Hellwig, Jens Axboe

Hi,
This has triggered in 5.10.77 yesterday [1], and I was able to
reproduce it on 5.10.80 using the C repro from android-54 [2].
What happens is that the function do_mpage_readpage() calls
bdev_read_page() [3] passing in bdev == NULL, and bdev_read_page()
crashes here [4]. This happens in 5.15 down to 5.10, but it is fixed
in 5.16-rc1. I bisected it to the first good commit, which is:

af3c570fb0df ("loop: Use blk_validate_block_size() to validate block size")

The root cause seems to be loss of precision in loop_configure(),
when it calls loop_validate_block_size() in [5]. The config->block_size
is an uint32 and the bsize param passed to loop_validate_block_size() is
unsigned short. The reproducer sets up a loop device with the block size
equal to 0x20000400, which is bigger than USHRT_MAX.
The loop_validate_block_size() returns 0, but uses the invalid size
to setup the device. The new helper changes the bsize param type to uint,
and the issue goes away.

To fix this for the older kernels can we please have the two commits:

570b1cac4776 ("block: Add a helper to validate the block size")
af3c570fb0df ("loop: Use blk_validate_block_size() to validate block size")

applied to 5.15, 5.14, and 5.10.
The first one needs to be back ported, but the second applies cleanly.
I will follow up back ports for each version in few minutes.

-- 
Thanks,
Tadeusz

[1] https://syzkaller.appspot.com/bug?id=2a34ab9dad714959a3d2b60533acbd99094a5c5a
[2] https://syzkaller.appspot.com/x/repro.c?x=13420a05900000
[3] https://elixir.bootlin.com/linux/v5.15/source/fs/mpage.c#L302
[4] https://elixir.bootlin.com/linux/v5.15/source/block/bdev.c#L323
[5] https://elixir.bootlin.com/linux/v5.15/source/drivers/block/loop.c#L1239


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-11-19 12:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-18 23:08 general protection fault in bdev_read_page Tadeusz Struk
2021-11-18 23:57 ` [PATCH 5.15] block: Add a helper to validate the block size Tadeusz Struk
2021-11-19  1:55   ` Damien Le Moal
2021-11-19  2:41     ` Tadeusz Struk
2021-11-19  2:53       ` Damien Le Moal
2021-11-18 23:57 ` [PATCH 5.14] " Tadeusz Struk
2021-11-18 23:58 ` [PATCH 5.10] " Tadeusz Struk
2021-11-19 12:45 ` general protection fault in bdev_read_page Greg KH

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.