Message ID | 1414598972-22761-1-git-send-email-ard.biesheuvel@linaro.org |
---|---|
State | Accepted |
Commit | 8cccffc52694938fc88f3d90bc7fed8460e27191 |
Headers | show |
On Wed, 29 Oct 2014 17:09:32 +0100 , Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > Memory regions passed to early_init_dt_add_memory_arch() are rounded to > PAGE_SIZE by subtracting the size of the leading fractional page from > the 'size' argument. However, size being a u64 type, if its value is > sufficiently small, the subtraction wraps around and produces a bogus > value, potentially leading to crashes. > > Fix this by ignoring the memory range in such cases. > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Applied, thanks. g. > --- > drivers/of/fdt.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > index d1ffca8b34ea..3b423f5b99c6 100644 > --- a/drivers/of/fdt.c > +++ b/drivers/of/fdt.c > @@ -930,6 +930,11 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) > const u64 phys_offset = __pa(PAGE_OFFSET); > > if (!PAGE_ALIGNED(base)) { > + if (size < PAGE_SIZE - (base & ~PAGE_MASK)) { > + pr_warn("Ignoring memory block 0x%llx - 0x%llx\n", > + base, base + size); > + return; > + } > size -= PAGE_SIZE - (base & ~PAGE_MASK); > base = PAGE_ALIGN(base); > } > -- > 1.8.3.2 > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index d1ffca8b34ea..3b423f5b99c6 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -930,6 +930,11 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) const u64 phys_offset = __pa(PAGE_OFFSET); if (!PAGE_ALIGNED(base)) { + if (size < PAGE_SIZE - (base & ~PAGE_MASK)) { + pr_warn("Ignoring memory block 0x%llx - 0x%llx\n", + base, base + size); + return; + } size -= PAGE_SIZE - (base & ~PAGE_MASK); base = PAGE_ALIGN(base); }
Memory regions passed to early_init_dt_add_memory_arch() are rounded to PAGE_SIZE by subtracting the size of the leading fractional page from the 'size' argument. However, size being a u64 type, if its value is sufficiently small, the subtraction wraps around and produces a bogus value, potentially leading to crashes. Fix this by ignoring the memory range in such cases. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- drivers/of/fdt.c | 5 +++++ 1 file changed, 5 insertions(+)