bcachefs: fix shift oob in alloc_lru_idx_fragmentation

The size of a.data_type is set abnormally large, causing shift-out-of-bounds.
To fix this, we need to add validation on a.data_type in
alloc_lru_idx_fragmentation().

Reported-by: syzbot+7f45fa9805c40db3f108@syzkaller.appspotmail.com
Fixes: 260af1562e ("bcachefs: Kill alloc_v4.fragmentation_lru")
Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Jeongjun Park 2024-10-22 00:43:56 +09:00 committed by Kent Overstreet
parent 2045fc4295
commit 5c41f75d1b

View File

@ -168,6 +168,9 @@ static inline bool data_type_movable(enum bch_data_type type)
static inline u64 alloc_lru_idx_fragmentation(struct bch_alloc_v4 a, static inline u64 alloc_lru_idx_fragmentation(struct bch_alloc_v4 a,
struct bch_dev *ca) struct bch_dev *ca)
{ {
if (a.data_type >= BCH_DATA_NR)
return 0;
if (!data_type_movable(a.data_type) || if (!data_type_movable(a.data_type) ||
!bch2_bucket_sectors_fragmented(ca, a)) !bch2_bucket_sectors_fragmented(ca, a))
return 0; return 0;