aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/microcode
diff options
context:
space:
mode:
authorQuentin Casasnovas <quentin.casasnovas@oracle.com>2015-02-26 12:03:59 -0500
committerBorislav Petkov <bp@suse.de>2015-03-02 14:30:42 -0500
commitd496a002ae1f02425168e5211c237abee588651a (patch)
tree46ff2fc4f73c0de1758b4f19341d4476bdf6c898 /arch/x86/kernel/cpu/microcode
parentc517d838eb7d07bbe9507871fab3931deccff539 (diff)
x86/microcode/intel: Fix out of bounds memory access to the extended header
Improper pointer arithmetics when calculating the address of the extended header could lead to an out of bounds memory read and kernel panic. Signed-off-by: Quentin Casasnovas <quentin.casasnovas@oracle.com> Link: http://lkml.kernel.org/r/20150225094125.GB30434@chrystal.uk.oracle.com Signed-off-by: Borislav Petkov <bp@suse.de>
Diffstat (limited to 'arch/x86/kernel/cpu/microcode')
-rw-r--r--arch/x86/kernel/cpu/microcode/intel_early.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c
index 420eb933189c..3a6c6136c9da 100644
--- a/arch/x86/kernel/cpu/microcode/intel_early.c
+++ b/arch/x86/kernel/cpu/microcode/intel_early.c
@@ -180,8 +180,7 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
180 if (total_size <= data_size + MC_HEADER_SIZE) 180 if (total_size <= data_size + MC_HEADER_SIZE)
181 return UCODE_NFOUND; 181 return UCODE_NFOUND;
182 182
183 ext_header = (struct extended_sigtable *) 183 ext_header = (void *) mc_header + data_size + MC_HEADER_SIZE;
184 mc_header + data_size + MC_HEADER_SIZE;
185 ext_sigcount = ext_header->count; 184 ext_sigcount = ext_header->count;
186 ext_sig = (void *)ext_header + EXT_HEADER_SIZE; 185 ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
187 186
@@ -457,8 +456,7 @@ static void __ref show_saved_mc(void)
457 if (total_size <= data_size + MC_HEADER_SIZE) 456 if (total_size <= data_size + MC_HEADER_SIZE)
458 continue; 457 continue;
459 458
460 ext_header = (struct extended_sigtable *) 459 ext_header = (void *) mc_saved_header + data_size + MC_HEADER_SIZE;
461 mc_saved_header + data_size + MC_HEADER_SIZE;
462 ext_sigcount = ext_header->count; 460 ext_sigcount = ext_header->count;
463 ext_sig = (void *)ext_header + EXT_HEADER_SIZE; 461 ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
464 462