* [syzbot] [bcachefs?] UBSAN: shift-out-of-bounds in bch2_bkey_format_invalid @ 2024-05-08 8:11 syzbot 2024-05-09 0:22 ` [syzbot] [PATCH] bcachefs: guard against invalid bits_per_field " syzbot 0 siblings, 1 reply; 2+ messages in thread From: syzbot @ 2024-05-08 8:11 UTC (permalink / raw) To: bfoster, kent.overstreet, linux-bcachefs, linux-kernel, syzkaller-bugs Hello, syzbot found the following issue on: HEAD commit: 9221b2819b8a Add linux-next specific files for 20240503 git tree: linux-next console+strace: https://syzkaller.appspot.com/x/log.txt?x=153b20e4980000 kernel config: https://syzkaller.appspot.com/x/.config?x=8ab537f51a6a0d98 dashboard link: https://syzkaller.appspot.com/bug?extid=9833a1d29d4a44361e2c compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40 syz repro: https://syzkaller.appspot.com/x/repro.syz?x=114b7a50980000 C reproducer: https://syzkaller.appspot.com/x/repro.c?x=11b7ae87180000 Downloadable assets: disk image: https://storage.googleapis.com/syzbot-assets/3e67dbdc3c37/disk-9221b281.raw.xz vmlinux: https://storage.googleapis.com/syzbot-assets/ade618fa19f8/vmlinux-9221b281.xz kernel image: https://storage.googleapis.com/syzbot-assets/df12e5073c97/bzImage-9221b281.xz mounted in repro: https://storage.googleapis.com/syzbot-assets/d64ba6155455/mount_0.gz IMPORTANT: if you fix the issue, please add the following tag to the commit: Reported-by: syzbot+9833a1d29d4a44361e2c@syzkaller.appspotmail.com loop0: detected capacity change from 0 to 32768 bcachefs (loop0): mounting version 1.7: mi_btree_bitmap opts=compression=lz4,nojournal_transaction_names bcachefs (loop0): recovering from clean shutdown, journal seq 7 ------------[ cut here ]------------ UBSAN: shift-out-of-bounds in fs/bcachefs/bkey.c:663:22 shift exponent 254 is too large for 64-bit type 'unsigned long long' CPU: 1 PID: 5092 Comm: syz-executor406 Not tainted 6.9.0-rc6-next-20240503-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114 ubsan_epilogue lib/ubsan.c:231 [inline] __ubsan_handle_shift_out_of_bounds+0x3c8/0x420 lib/ubsan.c:468 bch2_bkey_format_invalid+0x46c/0x5c0 fs/bcachefs/bkey.c:663 validate_bset+0x168d/0x25a0 fs/bcachefs/btree_io.c:824 bch2_btree_node_read_done+0x20d2/0x5ed0 fs/bcachefs/btree_io.c:1142 btree_node_read_work+0x665/0x1300 fs/bcachefs/btree_io.c:1345 bch2_btree_node_read+0x2637/0x2c80 fs/bcachefs/btree_io.c:1730 __bch2_btree_root_read fs/bcachefs/btree_io.c:1769 [inline] bch2_btree_root_read+0x61e/0x970 fs/bcachefs/btree_io.c:1793 read_btree_roots+0x22d/0x7b0 fs/bcachefs/recovery.c:472 bch2_fs_recovery+0x2334/0x36e0 fs/bcachefs/recovery.c:800 bch2_fs_start+0x356/0x5b0 fs/bcachefs/super.c:1030 bch2_fs_open+0xa8d/0xdf0 fs/bcachefs/super.c:2105 bch2_mount+0x71d/0x1320 fs/bcachefs/fs.c:1917 legacy_get_tree+0xee/0x190 fs/fs_context.c:662 vfs_get_tree+0x90/0x2a0 fs/super.c:1780 do_new_mount+0x2be/0xb40 fs/namespace.c:3352 do_mount fs/namespace.c:3692 [inline] __do_sys_mount fs/namespace.c:3898 [inline] __se_sys_mount+0x2d9/0x3c0 fs/namespace.c:3875 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fa35434c8fa Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb a6 e8 5e 04 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 49 89 ca b8 a5 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fff2b30e848 EFLAGS: 00000282 ORIG_RAX: 00000000000000a5 RAX: ffffffffffffffda RBX: 00007fff2b30e860 RCX: 00007fa35434c8fa RDX: 0000000020005d80 RSI: 0000000020005dc0 RDI: 00007fff2b30e860 RBP: 0000000000000010 R08: 00007fff2b30e8a0 R09: 0000000000005d8f R10: 0000000000000010 R11: 0000000000000282 R12: 0000000000000004 R13: 00007fff2b30e8a0 R14: 0000000000000003 R15: 0000000001000000 </TASK> ---[ end trace ]--- --- This report is generated by a bot. It may contain errors. See https://goo.gl/tpsmEJ for more information about syzbot. syzbot engineers can be reached at syzkaller@googlegroups.com. syzbot will keep track of this issue. See: https://goo.gl/tpsmEJ#status for how to communicate with syzbot. If the report is already addressed, let syzbot know by replying with: #syz fix: exact-commit-title If you want syzbot to run the reproducer, reply with: #syz test: git://repo/address.git branch-or-commit-hash If you attach or paste a git patch, syzbot will apply it before testing. If you want to overwrite report's subsystems, reply with: #syz set subsystems: new-subsystem (See the list of subsystem names on the web dashboard) If the report is a duplicate of another one, reply with: #syz dup: exact-subject-of-another-report If you want to undo deduplication, reply with: #syz undup ^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [syzbot] [PATCH] bcachefs: guard against invalid bits_per_field in bch2_bkey_format_invalid 2024-05-08 8:11 [syzbot] [bcachefs?] UBSAN: shift-out-of-bounds in bch2_bkey_format_invalid syzbot @ 2024-05-09 0:22 ` syzbot 0 siblings, 0 replies; 2+ messages in thread From: syzbot @ 2024-05-09 0:22 UTC (permalink / raw) To: linux-kernel For archival purposes, forwarding an incoming command email to linux-kernel@vger.kernel.org. *** Subject: [PATCH] bcachefs: guard against invalid bits_per_field in bch2_bkey_format_invalid Author: cam.alvarez.i@gmail.com #syz test git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master A check for a valid value for bits_per_field is performed for each field before computing packed_max. If bits_per_field is invalid for any field the whole format is deemed invalid. Signed-off-by: Camila Alvarez <cam.alvarez.i@gmail.com> --- fs/bcachefs/bcachefs_format.h | 8 ++++++++ fs/bcachefs/bkey.c | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index d5b90439e581..23eb04148724 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -318,6 +318,14 @@ enum bch_bkey_fields { #define bkey_format_field(name, field) \ [BKEY_FIELD_##name] = (sizeof(((struct bkey *) NULL)->field) * 8) +#define BCH_BKEY_FIELDS() \ + x(INODE, p.inode) \ + x(OFFSET, p.offset) \ + x(SNAPSHOT, p.snapshot) \ + x(SIZE, size) \ + x(VERSION_HI, version.hi) \ + x(VERSION_LO, version.lo) + #define BKEY_FORMAT_CURRENT \ ((struct bkey_format) { \ .key_u64s = BKEY_U64s, \ diff --git a/fs/bcachefs/bkey.c b/fs/bcachefs/bkey.c index 76e79a15ba08..b6004b5f77e0 100644 --- a/fs/bcachefs/bkey.c +++ b/fs/bcachefs/bkey.c @@ -638,6 +638,13 @@ struct bkey_format bch2_bkey_format_done(struct bkey_format_state *s) return ret; } +static unsigned bch2_max_bits_per_field[] = { +#define x(name, field) \ + bkey_format_field(name, field), + BCH_BKEY_FIELDS() +#undef x +}; + int bch2_bkey_format_invalid(struct bch_fs *c, struct bkey_format *f, enum bkey_invalid_flags flags, @@ -659,8 +666,14 @@ int bch2_bkey_format_invalid(struct bch_fs *c, if (!c || c->sb.version_min >= bcachefs_metadata_version_snapshot) { unsigned unpacked_bits = bch2_bkey_format_current.bits_per_field[i]; u64 unpacked_max = ~((~0ULL << 1) << (unpacked_bits - 1)); - u64 packed_max = f->bits_per_field[i] - ? ~((~0ULL << 1) << (f->bits_per_field[i] - 1)) + unsigned bits_per_field = f->bits_per_field[i]; + if (bits_per_field > bch2_max_bits_per_field[i]) { + prt_printf(err, "field %u uses more bits than allowed: %u > %u", + i, bits_per_field, bch2_max_bits_per_field[i]); + return -BCH_ERR_invalid; + } + u64 packed_max = bits_per_field + ? ~((~0ULL << 1) << (bits_per_field - 1)) : 0; u64 field_offset = le64_to_cpu(f->field_offset[i]); -- 2.34.1 ^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-05-09 0:22 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-05-08 8:11 [syzbot] [bcachefs?] UBSAN: shift-out-of-bounds in bch2_bkey_format_invalid syzbot 2024-05-09 0:22 ` [syzbot] [PATCH] bcachefs: guard against invalid bits_per_field " syzbot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox