[PATCH 1/2] ARM: mm: fix set_memory_*() bounds checks

Russell King - ARM Linux linux at armlinux.org.uk
Tue Nov 29 09:59:20 PST 2016


On Tue, Nov 29, 2016 at 09:25:19AM -0600, Dave Gerlach wrote:
> Hi,
> On 11/21/2016 10:08 AM, Russell King wrote:
> >+static bool in_range(unsigned long start, unsigned long size,
> >+	unsigned long range_start, unsigned long range_end)
> >+{
> >+	return start >= range_start && start < range_end &&
> >+		size <= range_end - start;
> >+}
> >+
> > static int change_memory_common(unsigned long addr, int numpages,
> > 				pgprot_t set_mask, pgprot_t clear_mask)
> > {
> >-	unsigned long start = addr;
> >-	unsigned long size = PAGE_SIZE*numpages;
> >-	unsigned long end = start + size;
> >+	unsigned long start = addr & PAGE_SIZE;
> 
> This doesn't work as is, I believe 'start' should be set to
> PAGE_ALIGN(addr), addr & PAGE_SIZE as it is doesn't make sense. If I make
> this change this code works ok.

You're right, but we want to round 'addr' _down_, not up as PAGE_ALIGN()
will do.  So that should've been PAGE_MASK.

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.



More information about the linux-arm-kernel mailing list