[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20211011135526.282115-1-yangyingliang@huawei.com>
Date: Mon, 11 Oct 2021 21:55:26 +0800
From: Yang Yingliang <yangyingliang@...wei.com>
To: <linux-kernel@...r.kernel.org>
CC: <rafael@...nel.org>, <gregkh@...uxfoundation.org>,
<broonie@...nel.org>
Subject: [PATCH] regmap: Fix possible double-free in regcache_rbtree_exit()
In regcache_rbtree_insert_to_block(), when 'present' realloc failed,
the 'blk' which is supposed to assign to 'rbnode->block' will be freed,
so 'rbnode->block' points a freed memory, in the error handling path of
regcache_rbtree_init(), 'rbnode->block' will be freed again in
regcache_rbtree_exit(), KASAN will report double-free as follows:
BUG: KASAN: double-free or invalid-free in kfree+0xce/0x390
Call Trace:
dump_stack_lvl+0xe2/0x152
print_address_description.constprop.7+0x21/0x150
kasan_report_invalid_free+0x6f/0xa0
__kasan_slab_free+0x125/0x140
slab_free_freelist_hook+0x10d/0x240
kfree+0xce/0x390
regcache_rbtree_exit+0x15d/0x1a0
regcache_rbtree_init+0x224/0x2c0
regcache_init+0x88d/0x1310
__regmap_init+0x3151/0x4a80
__devm_regmap_init+0x7d/0x100
madera_spi_probe+0x10f/0x333 [madera_spi]
spi_probe+0x183/0x210
really_probe+0x285/0xc30
Set rbnode->block to NULL when the 'present' realloc failed to fix this.
Reported-by: Hulk Robot <hulkci@...wei.com>
Fixes: 3f4ff561bc88b ("regmap: rbtree: Make cache_present bitmap per node")
Signed-off-by: Yang Yingliang <yangyingliang@...wei.com>
---
drivers/base/regmap/regcache-rbtree.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index cfa29dc89bbf..125111688399 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -287,6 +287,7 @@ static int regcache_rbtree_insert_to_block(struct regmap *map,
GFP_KERNEL);
if (!present) {
kfree(blk);
+ rbnode->block = NULL;
return -ENOMEM;
}
--
2.25.1
Powered by blists - more mailing lists