lkml.org 
[lkml]   [2022]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 51/56] dm btree: add a defensive bounds check to insert_at()
    Date
    From: Joe Thornber <ejt@redhat.com>

    [ Upstream commit 85bca3c05b6cca31625437eedf2060e846c4bbad ]

    Corrupt metadata could trigger an out of bounds write.

    Signed-off-by: Joe Thornber <ejt@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 8aae0624a2971..6383afb88f319 100644
    --- a/drivers/md/persistent-data/dm-btree.c
    +++ b/drivers/md/persistent-data/dm-btree.c
    @@ -83,14 +83,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
    \
     
     \ /
      Last update: 2022-01-18 04:40    [W:2.584 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site