]> www.infradead.org Git - users/hch/configfs.git/commitdiff
bcachefs: Fix missing validation in bch2_sb_journal_v2_validate()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 Aug 2024 01:10:45 +0000 (21:10 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 Aug 2024 06:07:23 +0000 (02:07 -0400)
Reported-by: syzbot+47ecc948aadfb2ab3efc@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_sb.c

index db80e506e3abee5f2776d02cfe2508b90693b8b5..62b910f2fb27cd88af8867845c404ead988e4c16 100644 (file)
@@ -104,6 +104,7 @@ static int bch2_sb_journal_v2_validate(struct bch_sb *sb, struct bch_sb_field *f
        struct bch_sb_field_journal_v2 *journal = field_to_type(f, journal_v2);
        struct bch_member m = bch2_sb_member_get(sb, sb->dev_idx);
        int ret = -BCH_ERR_invalid_sb_journal;
+       u64 sum = 0;
        unsigned nr;
        unsigned i;
        struct u64_range *b;
@@ -119,6 +120,15 @@ 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 (b[i].end <= b[i].start) {
+                       prt_printf(err, "journal buckets entry with bad nr: %llu+%llu",
+                                  le64_to_cpu(journal->d[i].start),
+                                  le64_to_cpu(journal->d[i].nr));
+                       goto err;
+               }
+
+               sum += le64_to_cpu(journal->d[i].nr);
        }
 
        sort(b, nr, sizeof(*b), u64_range_cmp, NULL);
@@ -148,6 +158,11 @@ static int bch2_sb_journal_v2_validate(struct bch_sb *sb, struct bch_sb_field *f
                }
        }
 
+       if (sum > UINT_MAX) {
+               prt_printf(err, "too many journal buckets: %llu > %u", sum, UINT_MAX);
+               goto err;
+       }
+
        ret = 0;
 err:
        kfree(b);