[PATCH] regmap: Fix possible double-free in regcache_rbtree_exit()

From: Yang Yingliang
Date: Mon Oct 11 2021 - 09:49:07 EST


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@xxxxxxxxxx>
Fixes: 3f4ff561bc88b ("regmap: rbtree: Make cache_present bitmap per node")
Signed-off-by: Yang Yingliang <yangyingliang@xxxxxxxxxx>
---
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