]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bcachefs: Fix array-index-out-of-bounds
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 12 Jun 2024 23:51:15 +0000 (19:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 19 Jun 2024 22:27:23 +0000 (18:27 -0400)
We use 0 size arrays as markers, but ubsan doesn't know that - cast them
to a pointer to fix the splat.

Also, make sure this code gets tested a bit more.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bkey.c
fs/bcachefs/bkey_methods.c
fs/bcachefs/bkey_methods.h

index f46978e5cb7c63d441ea6c4a7a38c936e493b2b1..94a1d1982fa8890c5efb2175a95dbdbabf93ef03 100644 (file)
@@ -1064,7 +1064,7 @@ void bch2_bkey_swab_key(const struct bkey_format *_f, struct bkey_packed *k)
 {
        const struct bkey_format *f = bkey_packed(k) ? _f : &bch2_bkey_format_current;
        u8 *l = k->key_start;
-       u8 *h = (u8 *) (k->_data + f->key_u64s) - 1;
+       u8 *h = (u8 *) ((u64 *) k->_data + f->key_u64s) - 1;
 
        while (l < h) {
                swap(*l, *h);
index c2c3dae521865c70d5d86074ae74488b178c231d..bd32aac05192136a63200f52daa0cbe159637521 100644 (file)
@@ -398,8 +398,12 @@ void __bch2_bkey_compat(unsigned level, enum btree_id btree_id,
        for (i = 0; i < nr_compat; i++)
        switch (!write ? i : nr_compat - 1 - i) {
        case 0:
-               if (big_endian != CPU_BIG_ENDIAN)
+               if (big_endian != CPU_BIG_ENDIAN) {
+                       bch2_bkey_swab_key(f, k);
+               } else if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG)) {
                        bch2_bkey_swab_key(f, k);
+                       bch2_bkey_swab_key(f, k);
+               }
                break;
        case 1:
                if (version < bcachefs_metadata_version_bkey_renumber)
index 726ef74837638f3f8f9c7deb2311a5eded810aa1..baef0722f5fb60c7db294bd4d64018da281f97e9 100644 (file)
@@ -129,7 +129,8 @@ static inline void bch2_bkey_compat(unsigned level, enum btree_id btree_id,
                               struct bkey_packed *k)
 {
        if (version < bcachefs_metadata_version_current ||
-           big_endian != CPU_BIG_ENDIAN)
+           big_endian != CPU_BIG_ENDIAN ||
+           IS_ENABLED(CONFIG_BCACHEFS_DEBUG))
                __bch2_bkey_compat(level, btree_id, version,
                                   big_endian, write, f, k);