summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-08-11 18:22:40 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-08-11 18:23:11 -0800
commit8478a659ceb2219a6a55251a0db87f54fd82bebf (patch)
treef61554b865b096ab6e722d639d6c3189e22b6da6
parent1f5af7b5eec76ac23dc8121fa89b59b3f529184f (diff)
bcache: verify k->format when reading in btree nodes
-rw-r--r--drivers/md/bcache/btree_io.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/md/bcache/btree_io.c b/drivers/md/bcache/btree_io.c
index 34631d043645..57c820456b4f 100644
--- a/drivers/md/bcache/btree_io.c
+++ b/drivers/md/bcache/btree_io.c
@@ -228,6 +228,16 @@ static const char *validate_bset(struct cache_set *c, struct btree *b,
break;
}
+ if (k->format > KEY_FORMAT_CURRENT) {
+ btree_node_error(b, c, ptr,
+ "invalid bkey format %u", k->format);
+
+ i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - k->u64s);
+ memmove(k, bkey_next(k),
+ (void *) bset_bkey_last(i) - (void *) k);
+ continue;
+ }
+
if (BSET_BIG_ENDIAN(i) != CPU_BIG_ENDIAN)
bch_bkey_swab(btree_node_type(b), &b->keys.format, k);