]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commit
regmap: Fix possible double-free in regcache_rbtree_exit()
authorYang Yingliang <yangyingliang@huawei.com>
Tue, 12 Oct 2021 02:37:35 +0000 (10:37 +0800)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 24 Nov 2021 11:09:22 +0000 (12:09 +0100)
commitf9060f225c9cc7b7fddb522d6ea1c757429e4364
tree4df6a11f30fad41291679bbfbf4aa9c54a80a835
parentf1b63a5f08a39ec1b989af60cea6125cf8c257ea
regmap: Fix possible double-free in regcache_rbtree_exit()

BugLink: https://bugs.launchpad.net/bugs/1951883
commit 55e6d8037805b3400096d621091dfbf713f97e83 upstream.

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:
 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

To fix this, moving up the assignment of rbnode->block to immediately after
the reallocation has succeeded so that the data structure stays valid even
if the second reallocation fails.

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>
Link: https://lore.kernel.org/r/20211012023735.1632786-1-yangyingliang@huawei.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
drivers/base/regmap/regcache-rbtree.c