Re: [rppt:free-late/v0.3] [memblock, treewide] bbe3478393: KASAN:use-after-free_in_memblock_isolate_range

Oliver Sang <[email protected]> Mon, 23 Mar 2026 10:28:12 +0800
Newsgroups dev.linux.lists.oe-lkp
Message-ID <acClPFM3R6AnfFvM@xsang-OptiPlex-9020>
hi, Mike,

On Fri, Mar 20, 2026 at 03:32:45PM +0200, Mike Rapoport wrote:
> Hello,
> 
> On Fri, Mar 20, 2026 at 03:53:54PM +0800, kernel test robot wrote:
> > 
> > Hello,
> > 
> > kernel test robot noticed "KASAN:use-after-free_in_memblock_isolate_range" on:
> > 
> > commit: bbe3478393e135e2fc98f32fa8ab182de6742136 ("memblock, treewide: make memblock_free() handle late freeing")
> > https://git.kernel.org/cgit/linux/kernel/git/rppt/linux.git free-late/v0.3
> > 
> > in testcase: ltp
> > version: 
> > with following parameters:
> > 
> > 	test: uevent
> > 
> > 
> > config: x86_64-rhel-9.4-ltp
> > compiler: gcc-14
> > test machine: 22 threads 1 sockets Intel(R) Core(TM) Ultra 9 185H @ 4.5GHz (Meteor Lake) with 32G memory
> > 
> > (please refer to attached dmesg/kmsg for entire log/backtrace)
> > 
> > 
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <[email protected]>
> > | Closes: https://lore.kernel.org/oe-lkp/[email protected]
> 
> Thanks for the report!
> 
> The patch below fixes the issue for me, I'd appreciate if you can verify it
> on your setup as well:

yes, below patch can fix the issue we reported by same test. thanks

Tested-by: kernel test robot <[email protected]>

> 
> 
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 780e70d4971a..3e21d6135789 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -985,15 +985,18 @@ void __init_memblock memblock_free(void *ptr, size_t size)
>  int __init_memblock memblock_phys_free(phys_addr_t base, phys_addr_t size)
>  {
>  	phys_addr_t end = base + size - 1;
> +	int ret;
>  
>  	memblock_dbg("%s: [%pa-%pa] %pS\n", __func__,
>  		     &base, &end, (void *)_RET_IP_);
>  
>  	kmemleak_free_part_phys(base, size);
> +	ret = memblock_remove_range(&memblock.reserved, base, size);
> +
>  	if (slab_is_available())
>  		__free_reserved_area(base, base + size, -1);
>  
> -	return memblock_remove_range(&memblock.reserved, base, size);
> +	return ret;
>  }
>  
>  int __init_memblock __memblock_reserve(phys_addr_t base, phys_addr_t size,
> 
> -- 
> Sincerely yours,
> Mike.
>