diff options
author | Chen A Chen <chen.a.chen@intel.com> | 2019-03-05 08:21:18 +0800 |
---|---|---|
committer | Ray Ni <ray.ni@intel.com> | 2019-03-06 13:48:36 +0800 |
commit | 219e560c20034843ac9917146c60db99bd01b6f4 (patch) | |
tree | 628714030e9c27b1751c148b47f36a0b658dba6c | |
parent | 8ef3a6ec1f6a858bb14c40715db90c1e3927cced (diff) | |
download | edk2-219e560c20034843ac9917146c60db99bd01b6f4.tar.gz edk2-219e560c20034843ac9917146c60db99bd01b6f4.tar.bz2 edk2-219e560c20034843ac9917146c60db99bd01b6f4.zip |
UefiCpuPkg/Microcode.c: Add verification before calculate CheckSum32
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1020
Should make sure the TotalSize of Microcode is aligned with 4 bytes
before calling CalculateSum32 function.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
-rw-r--r-- | UefiCpuPkg/Library/MpInitLib/Microcode.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c b/UefiCpuPkg/Library/MpInitLib/Microcode.c index 5f9ae22794..643a6f94f4 100644 --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c @@ -166,20 +166,29 @@ MicrocodeDetect ( //
CorrectMicrocode = FALSE;
- //
- // Save an in-complete CheckSum32 from CheckSum Part1 for common parts.
- //
if (MicrocodeEntryPoint->DataSize == 0) {
- InCompleteCheckSum32 = CalculateSum32 (
- (UINT32 *) MicrocodeEntryPoint,
- sizeof (CPU_MICROCODE_HEADER) + 2000
- );
+ TotalSize = sizeof (CPU_MICROCODE_HEADER) + 2000;
} else {
- InCompleteCheckSum32 = CalculateSum32 (
- (UINT32 *) MicrocodeEntryPoint,
- sizeof (CPU_MICROCODE_HEADER) + MicrocodeEntryPoint->DataSize
- );
+ TotalSize = sizeof (CPU_MICROCODE_HEADER) + MicrocodeEntryPoint->DataSize;
}
+
+ ///
+ /// Check overflow and whether TotalSize is aligned with 4 bytes.
+ ///
+ if ( ((UINTN)MicrocodeEntryPoint + TotalSize) > MicrocodeEnd ||
+ (TotalSize & 0x3) != 0
+ ) {
+ MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (((UINTN) MicrocodeEntryPoint) + SIZE_1KB);
+ continue;
+ }
+
+ //
+ // Save an in-complete CheckSum32 from CheckSum Part1 for common parts.
+ //
+ InCompleteCheckSum32 = CalculateSum32 (
+ (UINT32 *) MicrocodeEntryPoint,
+ TotalSize
+ );
InCompleteCheckSum32 -= MicrocodeEntryPoint->ProcessorSignature.Uint32;
InCompleteCheckSum32 -= MicrocodeEntryPoint->ProcessorFlags;
InCompleteCheckSum32 -= MicrocodeEntryPoint->Checksum;
|