Skip to content

Commit aa2ddcc

Browse files
Christoph Hellwiggregkh
authored andcommitted
block: make bio_check_eod work for zero sized devices
commit 3eb9694 upstream. Since the dawn of time bio_check_eod has a check for a non-zero size of the device. This doesn't really make any sense as we never want to send I/O to a device that's been set to zero size, or never moved out of that. I am a bit surprised we haven't caught this for a long time, but the removal of the extra validation inside of zram caused syzbot to trip over this issue recently. I've added a Fixes tag for that commit, but the issue really goes back way before git history. Fixes: 9fe95ba ("zram: remove valid_io_request") Reported-by: syzbot+b8d61a58b7c7ebd2c8e0@syzkaller.appspotmail.com Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20230524060538.1593686-1-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk> Backport note for 6.1.y: The same underlying bug affects 6.1.y even though 9fe95ba is not in that tree. The syzbot reproducer attaches a socket to /dev/nbd0 without setting its capacity, then mounts it as BEFS. BEFS calls sb_bread() while bdev_nr_sectors() is zero. The maxsector guard makes bio_check_eod() accept that read, which reaches NBD and waits for a response instead of failing with -EIO. syzbot reproduced the resulting __bread_gfp() hang on 6.1.y and identified this upstream commit by fix bisection. Reported-by: syzbot+2aca91e1d3ae43aef10c@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=2aca91e1d3ae43aef10c Signed-off-by: Miguel García <miguelgarciaroman8@gmail.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent efb6867 commit aa2ddcc

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

block/blk-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ static inline int bio_check_eod(struct bio *bio)
515515
sector_t maxsector = bdev_nr_sectors(bio->bi_bdev);
516516
unsigned int nr_sectors = bio_sectors(bio);
517517

518-
if (nr_sectors && maxsector &&
518+
if (nr_sectors &&
519519
(nr_sectors > maxsector ||
520520
bio->bi_iter.bi_sector > maxsector - nr_sectors)) {
521521
pr_info_ratelimited("%s: attempt to access beyond end of device\n"

0 commit comments

Comments
 (0)