aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaura Abbott <lauraa@codeaurora.org>2014-06-19 23:13:38 -0400
committerGrant Likely <grant.likely@linaro.org>2014-06-26 12:28:28 -0400
commita67a6ed15513541579d38bcbd127e7be170710e5 (patch)
tree571de22898d8ef2ce3f2afdd3cb0873f1ac12477
parenta497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee (diff)
of: Check for phys_addr_t overflows in early_init_dt_add_memory_arch
The common early_init_dt_add_memory_arch takes the base and size of a memory region as u64 types. The function never checks if the base and size can actually fit in a phys_addr_t which may be smaller than 64-bits. This may result in incorrect memory being passed to memblock_add if the memory falls outside the range of phys_addr_t. Add range checks for the base and size if phys_addr_t is smaller than u64. Reported-by: Geert Uytterhoeven <geert@linux-m68k.org> Tested-by: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> Acked-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Grant Likely <grant.likely@linaro.org>
-rw-r--r--drivers/of/fdt.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index c4cddf0cd96d..b777d8f46bd5 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -880,6 +880,21 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
880 const u64 phys_offset = __pa(PAGE_OFFSET); 880 const u64 phys_offset = __pa(PAGE_OFFSET);
881 base &= PAGE_MASK; 881 base &= PAGE_MASK;
882 size &= PAGE_MASK; 882 size &= PAGE_MASK;
883
884 if (sizeof(phys_addr_t) < sizeof(u64)) {
885 if (base > ULONG_MAX) {
886 pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
887 base, base + size);
888 return;
889 }
890
891 if (base + size > ULONG_MAX) {
892 pr_warning("Ignoring memory range 0x%lx - 0x%llx\n",
893 ULONG_MAX, base + size);
894 size = ULONG_MAX - base;
895 }
896 }
897
883 if (base + size < phys_offset) { 898 if (base + size < phys_offset) {
884 pr_warning("Ignoring memory block 0x%llx - 0x%llx\n", 899 pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
885 base, base + size); 900 base, base + size);