bcachefs: Add an overflow check in set_bkey_val_u64s()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 15 Aug 2022 18:05:44 +0000 (14:05 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:38 +0000 (17:09 -0400)
For now this is just a BUG_ON() - we may want to change this to return
an error in the future.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/bkey.h

index 6a637a408a9f1a2c08985ba074e4e2d8ad2541e7..8e9405f89537755380505428b92888d6217bd6be 100644 (file)
@@ -50,12 +50,15 @@ static inline size_t bkey_val_bytes(const struct bkey *k)
 
 static inline void set_bkey_val_u64s(struct bkey *k, unsigned val_u64s)
 {
-       k->u64s = BKEY_U64s + val_u64s;
+       unsigned u64s = BKEY_U64s + val_u64s;
+
+       BUG_ON(u64s > U8_MAX);
+       k->u64s = u64s;
 }
 
 static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes)
 {
-       k->u64s = BKEY_U64s + DIV_ROUND_UP(bytes, sizeof(u64));
+       set_bkey_val_u64s(k, DIV_ROUND_UP(bytes, sizeof(u64)));
 }
 
 #define bkey_val_end(_k)       ((void *) (((u64 *) (_k).v) + bkey_val_u64s((_k).k)))