diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-07-04 13:33:53 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-07-04 23:33:54 -0400 |
commit | 07ec713e056a73337bc0f53f5910f5179537b2c2 (patch) | |
tree | f43e435b6fb409f4dab4420be283690101904c7c /libbcachefs/bkey.c | |
parent | 55142cd0b5ef2a2150d4708dad0c3fd54a3ffd39 (diff) |
Update bcachefs sources to 1a510b00b6 bcachefs: Increase BTREE_TRANS_MEM_MAX
Diffstat (limited to 'libbcachefs/bkey.c')
-rw-r--r-- | libbcachefs/bkey.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/libbcachefs/bkey.c b/libbcachefs/bkey.c index 0053f32c..946dd27f 100644 --- a/libbcachefs/bkey.c +++ b/libbcachefs/bkey.c @@ -620,22 +620,22 @@ const char *bch2_bkey_format_validate(struct bkey_format *f) if (f->nr_fields != BKEY_NR_FIELDS) return "incorrect number of fields"; + /* + * Verify that the packed format can't represent fields larger than the + * unpacked format: + */ for (i = 0; i < f->nr_fields; i++) { unsigned unpacked_bits = bch2_bkey_format_current.bits_per_field[i]; - u64 unpacked_mask = ~((~0ULL << 1) << (unpacked_bits - 1)); + u64 unpacked_max = ~((~0ULL << 1) << (unpacked_bits - 1)); + u64 packed_max = f->bits_per_field[i] + ? ~((~0ULL << 1) << (f->bits_per_field[i] - 1)) + : 0; u64 field_offset = le64_to_cpu(f->field_offset[i]); - if (f->bits_per_field[i] > unpacked_bits) + if (packed_max + field_offset < packed_max || + packed_max + field_offset > unpacked_max) return "field too large"; - if ((f->bits_per_field[i] == unpacked_bits) && field_offset) - return "offset + bits overflow"; - - if (((field_offset + ((1ULL << f->bits_per_field[i]) - 1)) & - unpacked_mask) < - field_offset) - return "offset + bits overflow"; - bits += f->bits_per_field[i]; } |