Commit be482d62 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'efi-urgent' of...

Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/mfleming/efi into x86/urgent

Pull EFI fixes from Matt Fleming:

" - Fix regression in DMI sysfs code for handling "End of Table" entry
    and a type bug that could lead to integer overflow. (Ivan Khoronzhuk)

  - Fix boundary checking in efi_high_alloc() which can lead to memory
    corruption in the EFI boot stubs. (Yinghai Lu)"
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents a38ecbbd 6d9ff473
...@@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) ...@@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
* We have to be cautious here. We have seen BIOSes with DMI pointers * We have to be cautious here. We have seen BIOSes with DMI pointers
* pointing to completely the wrong place for example * pointing to completely the wrong place for example
*/ */
static void dmi_table(u8 *buf, int len, int num, static void dmi_table(u8 *buf, u32 len, int num,
void (*decode)(const struct dmi_header *, void *), void (*decode)(const struct dmi_header *, void *),
void *private_data) void *private_data)
{ {
...@@ -92,12 +92,6 @@ static void dmi_table(u8 *buf, int len, int num, ...@@ -92,12 +92,6 @@ static void dmi_table(u8 *buf, int len, int num,
while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) {
const struct dmi_header *dm = (const struct dmi_header *)data; const struct dmi_header *dm = (const struct dmi_header *)data;
/*
* 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
*/
if (dm->type == DMI_ENTRY_END_OF_TABLE)
break;
/* /*
* We want to know the total length (formatted area and * We want to know the total length (formatted area and
* strings) before decoding to make sure we won't run off the * strings) before decoding to make sure we won't run off the
...@@ -108,13 +102,20 @@ static void dmi_table(u8 *buf, int len, int num, ...@@ -108,13 +102,20 @@ static void dmi_table(u8 *buf, int len, int num,
data++; data++;
if (data - buf < len - 1) if (data - buf < len - 1)
decode(dm, private_data); decode(dm, private_data);
/*
* 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
*/
if (dm->type == DMI_ENTRY_END_OF_TABLE)
break;
data += 2; data += 2;
i++; i++;
} }
} }
static phys_addr_t dmi_base; static phys_addr_t dmi_base;
static u16 dmi_len; static u32 dmi_len;
static u16 dmi_num; static u16 dmi_num;
static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,
......
...@@ -179,12 +179,12 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg, ...@@ -179,12 +179,12 @@ efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
start = desc->phys_addr; start = desc->phys_addr;
end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT); end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
if ((start + size) > end || (start + size) > max) if (end > max)
continue;
if (end - size > max)
end = max; end = max;
if ((start + size) > end)
continue;
if (round_down(end - size, align) < start) if (round_down(end - size, align) < start)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment