On Tue, 20 Aug 2024 19:34:18 -0400, Kent Overstreet wrote:
> > When journal v2 entry nr overflow, it will cause the value of ja->nr to
> > be incorrect, this will result in the allocated memory to ja->buckets
> > being too small, leading to out of bounds access in bch2_dev_journal_init.
> >
> > Reported-by: syzbot+47ecc948aadfb2ab3...@syzkaller.appspotmail.com
> > Signed-off-by: Lizhi Xu <lizhi...@windriver.com>
> > ---
> >  fs/bcachefs/journal_sb.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/fs/bcachefs/journal_sb.c b/fs/bcachefs/journal_sb.c
> > index db80e506e3ab..db2b2100e4e5 100644
> > --- a/fs/bcachefs/journal_sb.c
> > +++ b/fs/bcachefs/journal_sb.c
> > @@ -119,6 +119,11 @@ static int bch2_sb_journal_v2_validate(struct bch_sb 
> > *sb, struct bch_sb_field *f
> >     for (i = 0; i < nr; i++) {
> >             b[i].start = le64_to_cpu(journal->d[i].start);
> >             b[i].end = b[i].start + le64_to_cpu(journal->d[i].nr);
> > +           if (le64_to_cpu(journal->d[i].nr) > UINT_MAX) {
> > +                   prt_printf(err, "journal v2 entry d[%u].nr %llu 
> > overflow\n",
> > +                           i, le64_to_cpu(journal->d[i].nr));
> > +                   goto err;
> > +           }
> 
> no, you need to sum up _all_ the entries and verify the total doesn't
> overflow UINT_MAX
The overflow value of le64_to_cpu(journal->d[i].nr) is 18446744073709551615(for 
u64),
or in other words, it is -1 for s64.

Therefore, the existing check for single entry is retained, and an overflow
check for the total value of all entry is will added.

BR,
Lizhi

Reply via email to