Re: [PATCH 6.1.y] mm/damon/core: validate ranges in damon_set_regions()

SJ Park <[email protected]> Wed, 29 Jul 2026 21:07:39 -0700
Newsgroups dev.linux.lists.damon
Message-ID <[email protected]>
On Thu, 30 Jul 2026 01:18:26 +0000 [email protected] wrote:

> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> 
> New issues:
> - [High] The validation check fails to consistently reject unaligned zero-length regions, allowing them to bypass validation and silently expand.
> - [High] The ALIGN() macro overflows to 0 when evaluating regions near the end of the 32-bit address space, causing valid regions to be erroneously rejected.
> 
> Pre-existing issues:
> - [High] Pre-existing leak of `struct pid` references if target addition or context setup fails during sysfs input application.
> --
> 
> --- Patch [1]: [PATCH 6.1.y] mm/damon/core: validate ranges in damon_set_regions() ---
> commit a1c890d67da57c98800fdd95b91daeac6ab475ab
> Author: SJ Park <[email protected]>
> 
> mm/damon/core: validate ranges in damon_set_regions()
> 
> This commit adds a validation check in damon_set_regions() to ensure that the
> provided region ranges are valid. It aims to prevent empty or negative length
> regions from causing warnings and divide-by-zero errors in the core logic.
> 
> Link: https://lore.kernel.org/[email protected]
> 
> > diff --git a/mm/damon/core.c b/mm/damon/core.c
> > index 4b434ebd37c53..0a0bb033f28a4 100644
> > --- a/mm/damon/core.c
> > +++ b/mm/damon/core.c
> > @@ -212,6 +212,12 @@ int damon_set_regions(struct damon_target *t, struct damon_addr_range *ranges,
> >  	unsigned int i;
> >  	int err;
> >  
> > +	for (i = 0; i < nr_ranges; i++) {
> > +		if (ALIGN_DOWN(ranges[i].start, DAMON_MIN_REGION) >=
> > +				ALIGN(ranges[i].end, DAMON_MIN_REGION))
> 
> [Severity: High]
> Does this logic successfully catch unaligned zero-length regions?
> 
> If a user configures a region with start and end both at an unaligned address
> like 4097, ALIGN_DOWN(4097) evaluates to 4096, and ALIGN(4097) evaluates to
> 8192. The check 4096 >= 8192 is false, which allows the invalid empty region
> to bypass validation and silently expand into a full page.

No problem.  It is an intended behavior.

> 
> [Severity: High]
> Will this ALIGN() check overflow on 32-bit systems when evaluating regions
> near the end of the address space?
> 
> If the end address of the physical memory resource is ULONG_MAX (0xFFFFFFFF),
> ALIGN(0xFFFFFFFF, 4096) overflows the 32-bit unsigned integer and evaluates
> to 0. This makes the check ALIGN_DOWN(start) >= 0 unconditionally true, which
> erroneously rejects valid memory regions and prevents DAMON initialization.

For 32 bit systems having >4GiB memory, we provide addr_unit feature.  The user
could avoid the issue by using that.  So no problem.

> 
> > +			return -EINVAL;
> > +	}
> > +
> >  	/* Remove regions which are not in the new ranges */
> 
> [Severity: High]
> This is a pre-existing issue, but does damon_destroy_ctx() leak struct pid
> references if context setup fails?
> 
> Looking at damon_sysfs_build_ctx() in mm/damon/sysfs.c:
> 
> 	err = damon_sysfs_apply_inputs(ctx, sys_ctx);
> 	if (err) {
> 		damon_destroy_ctx(ctx);
> 		return ERR_PTR(err);
> 	}
> 
> If damon_sysfs_apply_inputs() successfully adds targets (incrementing struct
> pid refcounts) but a subsequent step fails, damon_destroy_ctx() is called.
> 
> Since vaddr ops do not define a .cleanup callback and the before_terminate
> callback is never executed, the damon_target structures are freed without
> calling put_pid(), permanently leaking the PID references.

Good finding.  Mainline tree avoided this issue by refactoring the code, with
commits including 7114bc5e01cf ("mm/damon/core: add cleanup_target() ops
callback").  Porting the all commits would be challenging.  I will work on this
with a dedicated fix.

> 
> -- 
> Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=1


Thanks,
SJ