Commit 40b7f3df authored by Borislav Petkov's avatar Borislav Petkov

x86, microcode, AMD: Fix section header size check

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: default avatarBen Hutchings <ben@decadent.org.uk>
Link: http://lkml.kernel.org/r/1302752223.5282.674.camel@localhostSigned-off-by: default avatarBorislav Petkov <borislav.petkov@amd.com>
parent 86b44567
...@@ -66,8 +66,8 @@ struct microcode_amd { ...@@ -66,8 +66,8 @@ struct microcode_amd {
unsigned int mpb[0]; unsigned int mpb[0];
}; };
#define UCODE_CONTAINER_SECTION_HDR 8 #define SECTION_HDR_SIZE 8
#define UCODE_CONTAINER_HEADER_SIZE 12 #define CONTAINER_HDR_SZ 12
static struct equiv_cpu_entry *equiv_cpu_table; 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) ...@@ -177,7 +177,7 @@ static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size)
actual_size = *(u32 *)(buf + 4); 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"); pr_err("section size mismatch\n");
return 0; return 0;
} }
...@@ -204,8 +204,8 @@ get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size) ...@@ -204,8 +204,8 @@ get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size)
if (!mc) if (!mc)
goto out; goto out;
get_ucode_data(mc, buf + UCODE_CONTAINER_SECTION_HDR, actual_size); get_ucode_data(mc, buf + SECTION_HDR_SIZE, actual_size);
*mc_size = actual_size + UCODE_CONTAINER_SECTION_HDR; *mc_size = actual_size + SECTION_HDR_SIZE;
out: out:
return mc; return mc;
...@@ -229,9 +229,10 @@ static int install_equiv_cpu_table(const u8 *buf) ...@@ -229,9 +229,10 @@ static int install_equiv_cpu_table(const u8 *buf)
return -ENOMEM; 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) static void free_equiv_cpu_table(void)
......
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