Skip to content

Commit 7ba1f6e

Browse files
author
Kent Overstreet
committed
bcachefs; guard against overflow in btree node split
Signed-off-by: Kent Overstreet <[email protected]>
1 parent 0fa3b97 commit 7ba1f6e

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

fs/bcachefs/btree_update_interior.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,8 +1346,11 @@ static void __btree_split_node(struct btree_update *as,
13461346
struct bkey_packed *out[2];
13471347
struct bkey uk;
13481348
unsigned u64s, n1_u64s = (b->nr.live_u64s * 3) / 5;
1349+
struct { unsigned nr_keys, val_u64s; } nr_keys[2];
13491350
int i;
13501351

1352+
memset(&nr_keys, 0, sizeof(nr_keys));
1353+
13511354
for (i = 0; i < 2; i++) {
13521355
BUG_ON(n[i]->nsets != 1);
13531356

@@ -1369,6 +1372,9 @@ static void __btree_split_node(struct btree_update *as,
13691372
if (!i)
13701373
n1_pos = uk.p;
13711374
bch2_bkey_format_add_key(&format[i], &uk);
1375+
1376+
nr_keys[i].nr_keys++;
1377+
nr_keys[i].val_u64s += bkeyp_val_u64s(&b->format, k);
13721378
}
13731379

13741380
btree_set_min(n[0], b->data->min_key);
@@ -1381,6 +1387,12 @@ static void __btree_split_node(struct btree_update *as,
13811387
bch2_bkey_format_add_pos(&format[i], n[i]->data->max_key);
13821388

13831389
n[i]->data->format = bch2_bkey_format_done(&format[i]);
1390+
1391+
unsigned u64s = nr_keys[i].nr_keys * n[i]->data->format.key_u64s +
1392+
nr_keys[i].val_u64s;
1393+
if (__vstruct_bytes(struct btree_node, u64s) > btree_bytes(as->c))
1394+
n[i]->data->format = b->format;
1395+
13841396
btree_node_set_format(n[i], n[i]->data->format);
13851397
}
13861398

0 commit comments

Comments
 (0)