On Tue, 25 Jun 2019 at 01:22, Doug Berger wrote: > The description of the cma_declare_contiguous() function indicates > that if the 'fixed' argument is true the reserved contiguous area > must be exactly at the address of the 'base' argument. > > However, the function currently allows the 'base', 'size', and > 'limit' arguments to be silently adjusted to meet alignment > constraints. This commit enforces the documented behavior through > explicit checks that return an error if the region does not fit > within a specified region. > > Fixes: 5ea3b1b2f8ad ("cma: add placement specifier for "cma=" kernel > parameter") > Signed-off-by: Doug Berger > Acked-by: Michal Nazarewicz > --- > mm/cma.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/mm/cma.c b/mm/cma.c > index 3340ef34c154..4973d253dc83 100644 > --- a/mm/cma.c > +++ b/mm/cma.c > @@ -278,6 +278,12 @@ int __init cma_declare_contiguous(phys_addr_t base, > */ > alignment = max(alignment, (phys_addr_t)PAGE_SIZE << > max_t(unsigned long, MAX_ORDER - 1, > pageblock_order)); > + if (fixed && base & (alignment - 1)) { > + ret = -EINVAL; > + pr_err("Region at %pa must be aligned to %pa bytes\n", > + &base, &alignment); > + goto err; > + } > base = ALIGN(base, alignment); > size = ALIGN(size, alignment); > limit &= ~(alignment - 1); > @@ -308,6 +314,13 @@ int __init cma_declare_contiguous(phys_addr_t base, > if (limit == 0 || limit > memblock_end) > limit = memblock_end; > > + if (base + size > limit) { > + ret = -EINVAL; > + pr_err("Size (%pa) of region at %pa exceeds limit (%pa)\n", > + &size, &base, &limit); > + goto err; > + } > + > /* Reserve memory */ > if (fixed) { > if (memblock_is_region_reserved(base, size) || > -- > 2.7.4 > > -- Best regards ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ «If at first you don’t succeed, give up skydiving»