[PATCH] fs: block_dev.c: fix WARNING in submit_bio_check

28 views
Skip to first unread message

B K Karthik

unread,
Jul 16, 2020, 12:35:25 AM7/16/20
to syzbot+4c50ac...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master

Perhaps we could try and check for write permissions
before we handed the file descriptor to blkdev_put() ?

duplicating the logic in blkdev_get_by_path() to
blkdev_get_by_dev() to avoid a user triggerable WARN
trying to write to a read-only block device.

blkdev_get_by_path() looks at ((mode & FMODE_WRITE) && bdev_read_only(bdev))
to check for write permissions. We can avoid this
particular user-triggerable WARN by doing the same with blkdev_get_by_dev()

Reported-by: syzbot+4c50ac...@syzkaller.appspotmail.com
Signed-off-by: B K Karthik <karthik...@live.com>
---
fs/block_dev.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 64c4fe8181f2..472e3b046406 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1796,6 +1796,11 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
if (err)
return ERR_PTR(err);

+ if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
+ blkdev_put(bdev, mode);
+ return ERR_PTR(-EACCES);
+ }
+
return bdev;
}
EXPORT_SYMBOL(blkdev_get_by_dev);
--
2.20.1

signature.asc

syzbot

unread,
Jul 16, 2020, 2:30:05 AM7/16/20
to bkka...@pesu.pes.edu, syzkall...@googlegroups.com
Hello,

syzbot has tested the proposed patch but the reproducer is still triggering an issue:
WARNING in submit_bio_checks

------------[ cut here ]------------
Trying to write to read-only block-device nullb0 (partno 0)
WARNING: CPU: 0 PID: 8291 at block/blk-core.c:857 bio_check_ro block/blk-core.c:857 [inline]
WARNING: CPU: 0 PID: 8291 at block/blk-core.c:857 submit_bio_checks+0x1aba/0x1f70 block/blk-core.c:985
Kernel panic - not syncing: panic_on_warn set ...
CPU: 0 PID: 8291 Comm: syz-executor.2 Not tainted 5.8.0-rc5-next-20200715-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x18f/0x20d lib/dump_stack.c:118
panic+0x2e3/0x75c kernel/panic.c:231
__warn.cold+0x20/0x45 kernel/panic.c:600
report_bug+0x1bd/0x210 lib/bug.c:198
handle_bug+0x38/0x90 arch/x86/kernel/traps.c:234
exc_invalid_op+0x13/0x40 arch/x86/kernel/traps.c:254
asm_exc_invalid_op+0x12/0x20 arch/x86/include/asm/idtentry.h:542
RIP: 0010:bio_check_ro block/blk-core.c:857 [inline]
RIP: 0010:submit_bio_checks+0x1aba/0x1f70 block/blk-core.c:985
Code: 04 00 00 45 8b a4 24 a4 05 00 00 48 8d 74 24 68 48 89 ef e8 b8 21 fe ff 48 c7 c7 20 f7 91 88 48 89 c6 44 89 e2 e8 e8 a1 c0 fd <0f> 0b 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1 ea 03 80 3c 02
RSP: 0018:ffffc90004a370f8 EFLAGS: 00010286
RAX: 0000000000000000 RBX: ffff8880a0cab078 RCX: 0000000000000000
RDX: ffff8880a8bd6400 RSI: ffffffff815d8a17 RDI: fffff52000946e11
RBP: ffff8880a12fad40 R08: 0000000000000001 R09: ffff8880ae6318e7
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: ffff8880a12fad48 R14: 0000000000000000 R15: ffff8880a12fad68
submit_bio_noacct+0x89/0x12b0 block/blk-core.c:1197
submit_bio+0x263/0x5b0 block/blk-core.c:1282
submit_bh_wbc+0x685/0x8e0 fs/buffer.c:3107
__block_write_full_page+0x837/0x12e0 fs/buffer.c:1847
block_write_full_page+0x214/0x270 fs/buffer.c:3033
__writepage+0x60/0x170 mm/page-writeback.c:2311
write_cache_pages+0x736/0x11b0 mm/page-writeback.c:2246
generic_writepages mm/page-writeback.c:2337 [inline]
generic_writepages+0xe2/0x150 mm/page-writeback.c:2326
do_writepages+0xec/0x290 mm/page-writeback.c:2352
__filemap_fdatawrite_range+0x2a1/0x380 mm/filemap.c:422
filemap_write_and_wait_range mm/filemap.c:655 [inline]
filemap_write_and_wait_range+0xe1/0x1c0 mm/filemap.c:649
filemap_write_and_wait include/linux/fs.h:2628 [inline]
__sync_blockdev fs/block_dev.c:480 [inline]
sync_blockdev fs/block_dev.c:489 [inline]
__blkdev_put+0x69a/0x890 fs/block_dev.c:1852
blkdev_close+0x8c/0xb0 fs/block_dev.c:1936
__fput+0x33c/0x880 fs/file_table.c:281
task_work_run+0xdd/0x190 kernel/task_work.c:135
exit_task_work include/linux/task_work.h:25 [inline]
do_exit+0xb7d/0x29f0 kernel/exit.c:806
do_group_exit+0x125/0x310 kernel/exit.c:903
get_signal+0x40b/0x1ee0 kernel/signal.c:2743
do_signal+0x82/0x2520 arch/x86/kernel/signal.c:810
exit_to_usermode_loop arch/x86/entry/common.c:235 [inline]
__prepare_exit_to_usermode+0x14d/0x1f0 arch/x86/entry/common.c:269
do_syscall_64+0x6c/0xe0 arch/x86/entry/common.c:393
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x45cba9
Code: Bad RIP value.
RSP: 002b:00007f7882ce5cf8 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca
RAX: 0000000000000001 RBX: 000000000078bfa8 RCX: 000000000045cba9
RDX: 00000000000f4240 RSI: 0000000000000081 RDI: 000000000078bfac
RBP: 000000000078bfa0 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 000000000078bfac
R13: 00007fff25bc38af R14: 00007f7882ce69c0 R15: 000000000078bfac
Kernel Offset: disabled
Rebooting in 86400 seconds..


Tested on:

commit: ca0e494a Add linux-next specific files for 20200715
git tree: linux-next
console output: https://syzkaller.appspot.com/x/log.txt?x=1544eb00900000
kernel config: https://syzkaller.appspot.com/x/.config?x=afe9e230b4d3e174
dashboard link: https://syzkaller.appspot.com/bug?extid=4c50ac32e5b10e4133e1
compiler: gcc (GCC) 10.1.0-syz 20200507
patch: https://syzkaller.appspot.com/x/patch.diff?x=1750daeb100000

Reply all
Reply to author
Forward
0 new messages