Messages in this thread Patch in this message | | | From | Yang Yingliang <> | Subject | [PATCH] regmap: Fix possible double-free in regcache_rbtree_exit() | Date | Mon, 11 Oct 2021 21:55:26 +0800 |
| |
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@huawei.com> Fixes: 3f4ff561bc88b ("regmap: rbtree: Make cache_present bitmap per node") Signed-off-by: Yang Yingliang <yangyingliang@huawei.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
| |