bcachefs: Guard against backpointers to unknown btrees
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 28 Nov 2024 03:29:54 +0000 (22:29 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:20 +0000 (01:36 -0500)
Reported-by: syzbot+997f0573004dcb964555@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/backpointers.c
fs/bcachefs/sb-errors_format.h

index ff08afd667a07e6491ca7f3186904621aea4964b..702bf62d7fa7249baf8f886f21a245d3e4142da5 100644 (file)
@@ -249,9 +249,12 @@ struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans,
                                         struct btree_iter *iter,
                                         unsigned iter_flags)
 {
-       if (likely(!bp.v->level)) {
-               struct bch_fs *c = trans->c;
+       struct bch_fs *c = trans->c;
 
+       if (unlikely(bp.v->btree_id >= btree_id_nr_alive(c)))
+               return bkey_s_c_null;
+
+       if (likely(!bp.v->level)) {
                bch2_trans_node_iter_init(trans, iter,
                                          bp.v->btree_id,
                                          bp.v->pos,
index 917ef6aa4a23a6295db55434863a99a547adb7e4..e73d1c60198e491cca5a7dcdfe9fcf543784e3ed 100644 (file)
@@ -67,7 +67,7 @@ enum bch_fsck_flags {
        x(btree_node_bkey_past_bset_end,                         54,    0)              \
        x(btree_node_bkey_bad_format,                            55,    0)              \
        x(btree_node_bad_bkey,                                   56,    0)              \
-       x(btree_node_bkey_out_of_order,                          57,    0)              \
+       x(btree_node_bkey_out_of_order,                          57,    FSCK_AUTOFIX)   \
        x(btree_root_bkey_invalid,                               58,    FSCK_AUTOFIX)   \
        x(btree_root_read_error,                                 59,    FSCK_AUTOFIX)   \
        x(btree_root_bad_min_key,                                60,    0)              \