]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix invalid shift in validate_sb_layout()
authorGianfranco Trad <gianf.trad@gmail.com>
Wed, 23 Oct 2024 21:30:44 +0000 (23:30 +0200)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 24 Oct 2024 21:41:43 +0000 (17:41 -0400)
Add check on layout->sb_max_size_bits against BCH_SB_LAYOUT_SIZE_BITS_MAX
to prevent UBSAN shift-out-of-bounds in validate_sb_layout().

Reported-by: syzbot+089fad5a3a5e77825426@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=089fad5a3a5e77825426
Fixes: 03ef80b469d5 ("bcachefs: Ignore unknown mount options")
Tested-by: syzbot+089fad5a3a5e77825426@syzkaller.appspotmail.com
Signed-off-by: Gianfranco Trad <gianf.trad@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/errcode.h
fs/bcachefs/super-io.c

index 649263516ab1b49bc13a6b72377f81cd0a0a4657..b6cbd716000b3cec1fde6d44f68bf94fcb35635e 100644 (file)
        x(BCH_ERR_invalid_sb_layout,    invalid_sb_layout_type)                 \
        x(BCH_ERR_invalid_sb_layout,    invalid_sb_layout_nr_superblocks)       \
        x(BCH_ERR_invalid_sb_layout,    invalid_sb_layout_superblocks_overlap)  \
+       x(BCH_ERR_invalid_sb_layout,    invalid_sb_layout_sb_max_size_bits)     \
        x(BCH_ERR_invalid_sb,           invalid_sb_members_missing)             \
        x(BCH_ERR_invalid_sb,           invalid_sb_members)                     \
        x(BCH_ERR_invalid_sb,           invalid_sb_disk_groups)                 \
index ce7410d72089226e4421ca452a2c47d8f0e8c132..7c71594f6a8bd369100a32539ec4f263d2c4ed50 100644 (file)
@@ -287,6 +287,11 @@ static int validate_sb_layout(struct bch_sb_layout *layout, struct printbuf *out
                return -BCH_ERR_invalid_sb_layout_nr_superblocks;
        }
 
+       if (layout->sb_max_size_bits > BCH_SB_LAYOUT_SIZE_BITS_MAX) {
+               prt_printf(out, "Invalid superblock layout: max_size_bits too high");
+               return -BCH_ERR_invalid_sb_layout_sb_max_size_bits;
+       }
+
        max_sectors = 1 << layout->sb_max_size_bits;
 
        prev_offset = le64_to_cpu(layout->sb_offset[0]);