diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-03-02 08:18:57 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-02 08:18:57 -0500 |
commit | be482d624c3112c761d429f314582850b62214b5 (patch) | |
tree | 7f90fd31eee17de9f71b398fa5a073ff401afffd /drivers/firmware | |
parent | a38ecbbd0be025a6ecbbfd22d2575a5b46317117 (diff) | |
parent | 6d9ff473317245e3e5cd9922b4520411c2296388 (diff) |
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: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/dmi_scan.c | 17 | ||||
-rw-r--r-- | drivers/firmware/efi/libstub/efi-stub-helper.c | 8 |
2 files changed, 13 insertions, 12 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index c5f7b4e9eb6c..69fac068669f 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
@@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) | |||
78 | * We have to be cautious here. We have seen BIOSes with DMI pointers | 78 | * We have to be cautious here. We have seen BIOSes with DMI pointers |
79 | * pointing to completely the wrong place for example | 79 | * pointing to completely the wrong place for example |
80 | */ | 80 | */ |
81 | static void dmi_table(u8 *buf, int len, int num, | 81 | static void dmi_table(u8 *buf, u32 len, int num, |
82 | void (*decode)(const struct dmi_header *, void *), | 82 | void (*decode)(const struct dmi_header *, void *), |
83 | void *private_data) | 83 | void *private_data) |
84 | { | 84 | { |
@@ -93,12 +93,6 @@ static void dmi_table(u8 *buf, int len, int num, | |||
93 | const struct dmi_header *dm = (const struct dmi_header *)data; | 93 | const struct dmi_header *dm = (const struct dmi_header *)data; |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0] | ||
97 | */ | ||
98 | if (dm->type == DMI_ENTRY_END_OF_TABLE) | ||
99 | break; | ||
100 | |||
101 | /* | ||
102 | * We want to know the total length (formatted area and | 96 | * We want to know the total length (formatted area and |
103 | * strings) before decoding to make sure we won't run off the | 97 | * strings) before decoding to make sure we won't run off the |
104 | * table in dmi_decode or dmi_string | 98 | * table in dmi_decode or dmi_string |
@@ -108,13 +102,20 @@ static void dmi_table(u8 *buf, int len, int num, | |||
108 | data++; | 102 | data++; |
109 | if (data - buf < len - 1) | 103 | if (data - buf < len - 1) |
110 | decode(dm, private_data); | 104 | decode(dm, private_data); |
105 | |||
106 | /* | ||
107 | * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0] | ||
108 | */ | ||
109 | if (dm->type == DMI_ENTRY_END_OF_TABLE) | ||
110 | break; | ||
111 | |||
111 | data += 2; | 112 | data += 2; |
112 | i++; | 113 | i++; |
113 | } | 114 | } |
114 | } | 115 | } |
115 | 116 | ||
116 | static phys_addr_t dmi_base; | 117 | static phys_addr_t dmi_base; |
117 | static u16 dmi_len; | 118 | static u32 dmi_len; |
118 | static u16 dmi_num; | 119 | static u16 dmi_num; |
119 | 120 | ||
120 | static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, | 121 | static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, |
diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index 2fe195002021..f07d4a67fa76 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c | |||
@@ -179,12 +179,12 @@ again: | |||
179 | start = desc->phys_addr; | 179 | start = desc->phys_addr; |
180 | end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT); | 180 | end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT); |
181 | 181 | ||
182 | if ((start + size) > end || (start + size) > max) | 182 | if (end > max) |
183 | continue; | ||
184 | |||
185 | if (end - size > max) | ||
186 | end = max; | 183 | end = max; |
187 | 184 | ||
185 | if ((start + size) > end) | ||
186 | continue; | ||
187 | |||
188 | if (round_down(end - size, align) < start) | 188 | if (round_down(end - size, align) < start) |
189 | continue; | 189 | continue; |
190 | 190 | ||