Do more checking in the SRAT header code - Check if the processor/memory affinity entries are long enough according to the ACPI 3.0 spec. - Ignore memory affinity entries that define a zero length region. All based on BIOS issues found in the field @) Signed-off-by: Andi Kleen Index: linux/arch/x86_64/mm/srat.c =================================================================== --- linux.orig/arch/x86_64/mm/srat.c +++ linux/arch/x86_64/mm/srat.c @@ -131,7 +131,17 @@ void __init acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) { int pxm, node; - if (srat_disabled() || pa->flags.enabled == 0) + if (srat_disabled()) + return; + if (pa->header.length < offsetof(typeof(*pa), flags)+sizeof(pa->flags)) { + printk(KERN_WARNING + "SRAT: Processor affinity for PXM %d APIC %u too short (%u). Ignored.\n", + pa->proximity_domain, + pa->apic_id, + pa->header.length); + return; + } + if (pa->flags.enabled == 0) return; pxm = pa->proximity_domain; node = setup_node(pxm); @@ -155,17 +165,33 @@ acpi_numa_memory_affinity_init(struct ac int node, pxm; int i; - if (srat_disabled() || ma->flags.enabled == 0) + if (srat_disabled()) + return; + if (ma->header.length < offsetof(typeof(*ma), flags)+sizeof(ma->flags)) { + printk(KERN_WARNING + "SRAT: Memory affinity for PXM %d too short (%u bytes). Ignored.\n", + ma->proximity_domain, + ma->header.length); + return; + } + if (ma->flags.enabled == 0) return; + start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32); + end = start + (ma->length_lo | ((u64)ma->length_hi << 32)); pxm = ma->proximity_domain; + if (start == end) { + printk(KERN_WARNING + "SRAT: Memory affinity for PXM %u empty (%lx-%lx). Ignored.\n", + pxm, + start, end); + return; + } node = setup_node(pxm); if (node < 0) { printk(KERN_ERR "SRAT: Too many proximity domains.\n"); bad_srat(); return; } - start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32); - end = start + (ma->length_lo | ((u64)ma->length_hi << 32)); /* It is fine to add this area to the nodes data it will be used later*/ if (ma->flags.hot_pluggable == 1) printk(KERN_INFO "SRAT: hot plug zone found %lx - %lx \n",