diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-10 10:12:14 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-10 10:12:14 -0700 | 
| commit | 9376906c17fa975bf6a7ea9dd124be697bcda289 (patch) | |
| tree | f998d3d0a105daef7e78fc4457d33ce5d0c84e38 | |
| parent | 179145e6312b1ccb1731841360d7fcaf2f4abc7a (diff) | |
| parent | 792ef14df5c585c19b2831673a077504a09e5203 (diff) | |
| download | talos-op-linux-9376906c17fa975bf6a7ea9dd124be697bcda289.tar.gz talos-op-linux-9376906c17fa975bf6a7ea9dd124be697bcda289.zip  | |
Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI fix from Ingo Molnar:
 "A boot crash fix for certain systems where the kernel would trust a
  piece of firmware data it should not have"
* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  efi: Fix boot panic because of invalid BGRT image address
| -rw-r--r-- | drivers/firmware/efi/efi-bgrt.c | 26 | 
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/firmware/efi/efi-bgrt.c b/drivers/firmware/efi/efi-bgrt.c index 8bf27323f7a3..b58233e4ed71 100644 --- a/drivers/firmware/efi/efi-bgrt.c +++ b/drivers/firmware/efi/efi-bgrt.c @@ -27,6 +27,26 @@ struct bmp_header {  	u32 size;  } __packed; +static bool efi_bgrt_addr_valid(u64 addr) +{ +	efi_memory_desc_t *md; + +	for_each_efi_memory_desc(md) { +		u64 size; +		u64 end; + +		if (md->type != EFI_BOOT_SERVICES_DATA) +			continue; + +		size = md->num_pages << EFI_PAGE_SHIFT; +		end = md->phys_addr + size; +		if (addr >= md->phys_addr && addr < end) +			return true; +	} + +	return false; +} +  void __init efi_bgrt_init(struct acpi_table_header *table)  {  	void *image; @@ -36,7 +56,7 @@ void __init efi_bgrt_init(struct acpi_table_header *table)  	if (acpi_disabled)  		return; -	if (!efi_enabled(EFI_BOOT)) +	if (!efi_enabled(EFI_MEMMAP))  		return;  	if (table->length < sizeof(bgrt_tab)) { @@ -65,6 +85,10 @@ void __init efi_bgrt_init(struct acpi_table_header *table)  		goto out;  	} +	if (!efi_bgrt_addr_valid(bgrt->image_address)) { +		pr_notice("Ignoring BGRT: invalid image address\n"); +		goto out; +	}  	image = early_memremap(bgrt->image_address, sizeof(bmp_header));  	if (!image) {  		pr_notice("Ignoring BGRT: failed to map image header memory\n");  | 

