x86/microcode/intel: Fix out of bounds memory access to the extended header
authorQuentin Casasnovas <quentin.casasnovas@oracle.com>
Thu, 26 Feb 2015 17:03:59 +0000 (18:03 +0100)
committerBorislav Petkov <bp@suse.de>
Mon, 2 Mar 2015 19:30:42 +0000 (20:30 +0100)
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>
arch/x86/kernel/cpu/microcode/intel_early.c

index 420eb93..3a6c613 100644 (file)
@@ -180,8 +180,7 @@ matching_model_microcode(struct microcode_header_intel *mc_header,
        if (total_size <= data_size + MC_HEADER_SIZE)
                return UCODE_NFOUND;
 
-       ext_header = (struct extended_sigtable *)
-                    mc_header + data_size + MC_HEADER_SIZE;
+       ext_header = (void *) mc_header + data_size + MC_HEADER_SIZE;
        ext_sigcount = ext_header->count;
        ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
 
@@ -457,8 +456,7 @@ static void __ref show_saved_mc(void)
                if (total_size <= data_size + MC_HEADER_SIZE)
                        continue;
 
-               ext_header = (struct extended_sigtable *)
-                            mc_saved_header + data_size + MC_HEADER_SIZE;
+               ext_header = (void *) mc_saved_header + data_size + MC_HEADER_SIZE;
                ext_sigcount = ext_header->count;
                ext_sig = (void *)ext_header + EXT_HEADER_SIZE;