Some machines, such as the Lenovo ThinkPad W541 with firmware GNET80WW (2.28), include memory map entries with phys_addr=0x0 and num_pages=0. If we're inserting a new memmap and we find a map that is either 0 pages or all of possible memory (or more!), skip it. When a map exists at 0 that's 0 pages, the "end" math here winds up making *every* address within the range, and so it'll try to split that entry, and things go poorly after that. The same would be true if num_pages were U64_MAX or (U64_MAX >> EFI_PAGE_SHIFT) (i.e. all bits set as a size in bytes, but then shifted to page size to fill the table in). Don't even try to split those entries, they're nonsense. Signed-off-by: Peter Jones <pjones@xxxxxxxxxx> --- drivers/firmware/efi/memmap.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c index d3ba722..4503971 100644 --- a/drivers/firmware/efi/memmap.c +++ b/drivers/firmware/efi/memmap.c @@ -244,6 +244,15 @@ void __init efi_memmap_insert(struct efi_memory_map *old_memmap, void *buf, /* copy original EFI memory descriptor */ memcpy(new, old, old_memmap->desc_size); md = new; + if (md->num_pages == 0 || + md->num_pages > EFI_PAGES_MAX || + EFI_PAGES_MAX - md->num_pages < + (md->phys_addr >> EFI_PAGE_SHIFT)) { + pr_warn("%s: Skipping absurd memory map entry for 0x%llx pages at 0x%016llx.\n", + __func__, md->num_pages, md->phys_addr); + continue; + } + start = md->phys_addr; end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1; -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html