From: Joe Thornber <[email protected]>

[ Upstream commit 85bca3c05b6cca31625437eedf2060e846c4bbad ]

Corrupt metadata could trigger an out of bounds write.

Signed-off-by: Joe Thornber <[email protected]>
Signed-off-by: Mike Snitzer <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 drivers/md/persistent-data/dm-btree.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/md/persistent-data/dm-btree.c 
b/drivers/md/persistent-data/dm-btree.c
index 0703ca7a7d9a4..5ce64e93aae74 100644
--- a/drivers/md/persistent-data/dm-btree.c
+++ b/drivers/md/persistent-data/dm-btree.c
@@ -81,14 +81,16 @@ void inc_children(struct dm_transaction_manager *tm, struct 
btree_node *n,
 }
 
 static int insert_at(size_t value_size, struct btree_node *node, unsigned 
index,
-                     uint64_t key, void *value)
-                     __dm_written_to_disk(value)
+                    uint64_t key, void *value)
+       __dm_written_to_disk(value)
 {
        uint32_t nr_entries = le32_to_cpu(node->header.nr_entries);
+       uint32_t max_entries = le32_to_cpu(node->header.max_entries);
        __le64 key_le = cpu_to_le64(key);
 
        if (index > nr_entries ||
-           index >= le32_to_cpu(node->header.max_entries)) {
+           index >= max_entries ||
+           nr_entries >= max_entries) {
                DMERR("too many entries in btree node for insert");
                __dm_unbless_for_disk(value);
                return -ENOMEM;
-- 
2.34.1


--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to