x86, microcode, AMD: Fix section header size check
authorBorislav Petkov <borislav.petkov@amd.com>
Wed, 15 Jun 2011 13:34:57 +0000 (15:34 +0200)
committerBorislav Petkov <borislav.petkov@amd.com>
Thu, 16 Jun 2011 15:23:54 +0000 (17:23 +0200)
The ucode size check has to take the section header size into account
too when sanity checking the section length. Shorten and clarify define
names, while at it.

Caught-by: Ben Hutchings <ben@decadent.org.uk>
Link: http://lkml.kernel.org/r/1302752223.5282.674.camel@localhost
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
arch/x86/kernel/microcode_amd.c

index d30d67c..591be0e 100644 (file)
@@ -66,8 +66,8 @@ struct microcode_amd {
        unsigned int                    mpb[0];
 };
 
-#define UCODE_CONTAINER_SECTION_HDR    8
-#define UCODE_CONTAINER_HEADER_SIZE    12
+#define SECTION_HDR_SIZE       8
+#define CONTAINER_HDR_SZ       12
 
 static struct equiv_cpu_entry *equiv_cpu_table;
 
@@ -177,7 +177,7 @@ static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size)
 
        actual_size = *(u32 *)(buf + 4);
 
-       if (actual_size > size || actual_size > max_size) {
+       if (actual_size + SECTION_HDR_SIZE > size || actual_size > max_size) {
                pr_err("section size mismatch\n");
                return 0;
        }
@@ -204,8 +204,8 @@ get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size)
        if (!mc)
                goto out;
 
-       get_ucode_data(mc, buf + UCODE_CONTAINER_SECTION_HDR, actual_size);
-       *mc_size = actual_size + UCODE_CONTAINER_SECTION_HDR;
+       get_ucode_data(mc, buf + SECTION_HDR_SIZE, actual_size);
+       *mc_size = actual_size + SECTION_HDR_SIZE;
 
 out:
        return mc;
@@ -229,9 +229,10 @@ static int install_equiv_cpu_table(const u8 *buf)
                return -ENOMEM;
        }
 
-       get_ucode_data(equiv_cpu_table, buf + UCODE_CONTAINER_HEADER_SIZE, size);
+       get_ucode_data(equiv_cpu_table, buf + CONTAINER_HDR_SZ, size);
 
-       return size + UCODE_CONTAINER_HEADER_SIZE; /* add header length */
+       /* add header length */
+       return size + CONTAINER_HDR_SZ;
 }
 
 static void free_equiv_cpu_table(void)