aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorBorislav Petkov <bp@suse.de>2015-02-05 14:11:41 -0500
committerBorislav Petkov <bp@suse.de>2015-03-02 14:31:11 -0500
commitf9524e6f5447277e238b419afc3d0712941fa2a5 (patch)
treeb29d83d16599c077b541bf941d594e628cba3611 /arch/x86
parent776d3cdc93d83808bf5929d716a56c69bbe01d2f (diff)
x86/microcode/intel: Do the mc_saved_src NULL check first
... and only then deref it. Also, shorten some variable names and rename others so as to diminish the ubiquitous presence of the "mc_" prefix everywhere and make it a bit more readable. Use kcalloc so that we don't kfree() uninitialized memory on the unwind path, as suggested by Quentin. Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/cpu/microcode/intel_early.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c
index d515ff3feb8b..95516006958d 100644
--- a/arch/x86/kernel/cpu/microcode/intel_early.c
+++ b/arch/x86/kernel/cpu/microcode/intel_early.c
@@ -203,7 +203,7 @@ save_microcode(struct mc_saved_data *mc_saved_data,
203 unsigned int mc_saved_count) 203 unsigned int mc_saved_count)
204{ 204{
205 int i, j; 205 int i, j;
206 struct microcode_intel **mc_saved_p; 206 struct microcode_intel **saved_ptr;
207 int ret; 207 int ret;
208 208
209 if (!mc_saved_count) 209 if (!mc_saved_count)
@@ -212,39 +212,45 @@ save_microcode(struct mc_saved_data *mc_saved_data,
212 /* 212 /*
213 * Copy new microcode data. 213 * Copy new microcode data.
214 */ 214 */
215 mc_saved_p = kmalloc(mc_saved_count*sizeof(struct microcode_intel *), 215 saved_ptr = kcalloc(mc_saved_count, sizeof(struct microcode_intel *), GFP_KERNEL);
216 GFP_KERNEL); 216 if (!saved_ptr)
217 if (!mc_saved_p)
218 return -ENOMEM; 217 return -ENOMEM;
219 218
220 for (i = 0; i < mc_saved_count; i++) { 219 for (i = 0; i < mc_saved_count; i++) {
221 struct microcode_intel *mc = mc_saved_src[i]; 220 struct microcode_header_intel *mc_hdr;
222 struct microcode_header_intel *mc_header = &mc->hdr; 221 struct microcode_intel *mc;
223 unsigned long mc_size = get_totalsize(mc_header); 222 unsigned long size;
224 mc_saved_p[i] = kmalloc(mc_size, GFP_KERNEL); 223
225 if (!mc_saved_p[i]) {
226 ret = -ENOMEM;
227 goto err;
228 }
229 if (!mc_saved_src[i]) { 224 if (!mc_saved_src[i]) {
230 ret = -EINVAL; 225 ret = -EINVAL;
231 goto err; 226 goto err;
232 } 227 }
233 memcpy(mc_saved_p[i], mc, mc_size); 228
229 mc = mc_saved_src[i];
230 mc_hdr = &mc->hdr;
231 size = get_totalsize(mc_hdr);
232
233 saved_ptr[i] = kmalloc(size, GFP_KERNEL);
234 if (!saved_ptr[i]) {
235 ret = -ENOMEM;
236 goto err;
237 }
238
239 memcpy(saved_ptr[i], mc, size);
234 } 240 }
235 241
236 /* 242 /*
237 * Point to newly saved microcode. 243 * Point to newly saved microcode.
238 */ 244 */
239 mc_saved_data->mc_saved = mc_saved_p; 245 mc_saved_data->mc_saved = saved_ptr;
240 mc_saved_data->mc_saved_count = mc_saved_count; 246 mc_saved_data->mc_saved_count = mc_saved_count;
241 247
242 return 0; 248 return 0;
243 249
244err: 250err:
245 for (j = 0; j <= i; j++) 251 for (j = 0; j <= i; j++)
246 kfree(mc_saved_p[j]); 252 kfree(saved_ptr[j]);
247 kfree(mc_saved_p); 253 kfree(saved_ptr);
248 254
249 return ret; 255 return ret;
250} 256}