on 1/23/2025 10:10 AM, Liu Shixin wrote: > syzkaller reported a UBSAN shift-out-of-bounds warning of (1UL << order) > in isolate_freepages_block(). The bogus compound_order can be any value > because it is union with flags. Add back the MAX_PAGE_ORDER check to fix > the warning. > > Fixes: 3da0272a4c7d ("mm/compaction: correctly return failure with bogus compound_order in strict mode") > Signed-off-by: Liu Shixin <liushixin2@xxxxxxxxxx> > --- > mm/compaction.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/mm/compaction.c b/mm/compaction.c > index a2b16b08cbbff..384e4672998e5 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -630,7 +630,8 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, > if (PageCompound(page)) { > const unsigned int order = compound_order(page); > > - if (blockpfn + (1UL << order) <= end_pfn) { > + if ((order <= MAX_PAGE_ORDER) && > + (blockpfn + (1UL << order) <= end_pfn)) { > blockpfn += (1UL << order) - 1; > page += (1UL << order) - 1; > nr_scanned += (1UL << order) - 1; > Look good to me, feel free to add Reviewed-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx>