From: Kent Overstreet Date: Fri, 17 Jun 2022 02:38:10 +0000 (-0400) Subject: bcachefs: Check for extents with too many ptrs X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=b5f73fd79f4c710024ef4385626aecbaee6fc3f1;p=linux.git bcachefs: Check for extents with too many ptrs We have a hardcoded maximum on number of pointers in an extent that's used by some other data structures - notably bch_devs_list - but we weren't actually checking for it. Oops. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index b0226118077a2..4e44234a2b2c6 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -1078,6 +1078,7 @@ int bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k, struct bch_extent_crc_unpacked crc; unsigned size_ondisk = k.k->size; unsigned nonce = UINT_MAX; + unsigned nr_ptrs = 0; int ret; if (bkey_is_btree_ptr(k.k)) @@ -1102,6 +1103,7 @@ int bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k, false, err); if (ret) return ret; + nr_ptrs++; break; case BCH_EXTENT_ENTRY_crc32: case BCH_EXTENT_ENTRY_crc64: @@ -1140,6 +1142,11 @@ int bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k, } } + if (nr_ptrs >= BCH_BKEY_PTRS_MAX) { + prt_str(err, "too many ptrs"); + return -EINVAL; + } + return 0; }