X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FLibrary%2FSmmCorePerformanceLib%2FSmmCorePerformanceLib.c;h=e59cc28d537fa8b1db93443a3ec06b6371dc20d6;hp=f28b657c94ddba3fb012296f8721b44b264f8c76;hb=579b5ef204947defbd6fc60c11bdd740ad09d6e9;hpb=d7fc5cfd68bdf7d0b3d94fe08a523130c961d296 diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c index f28b657c94..e59cc28d53 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c @@ -482,7 +482,8 @@ SmmPerformanceHandlerEx ( EFI_STATUS Status; SMM_PERF_COMMUNICATE_EX *SmmPerfCommData; GAUGE_DATA_ENTRY_EX *GaugeEntryExArray; - UINTN DataSize; + UINT64 DataSize; + UINTN Index; GAUGE_DATA_ENTRY_EX *GaugeDataEx; UINTN NumberOfEntries; UINTN LogEntryKey; @@ -521,7 +522,7 @@ SmmPerformanceHandlerEx ( NumberOfEntries = SmmPerfCommData->NumberOfEntries; LogEntryKey = SmmPerfCommData->LogEntryKey; if (GaugeDataEx == NULL || NumberOfEntries == 0 || LogEntryKey > mGaugeData->NumberOfEntries || - NumberOfEntries > mGaugeData->NumberOfEntries || (LogEntryKey + NumberOfEntries) > mGaugeData->NumberOfEntries) { + NumberOfEntries > mGaugeData->NumberOfEntries || LogEntryKey > (mGaugeData->NumberOfEntries - NumberOfEntries)) { Status = EFI_INVALID_PARAMETER; break; } @@ -529,19 +530,22 @@ SmmPerformanceHandlerEx ( // // Sanity check // - DataSize = NumberOfEntries * sizeof(GAUGE_DATA_ENTRY_EX); - if (!SmmIsBufferOutsideSmmValid ((UINTN)GaugeDataEx, DataSize)) { + DataSize = MultU64x32 (NumberOfEntries, sizeof(GAUGE_DATA_ENTRY_EX)); + if (!SmmIsBufferOutsideSmmValid ((UINTN) GaugeDataEx, DataSize)) { DEBUG ((EFI_D_ERROR, "SmmPerformanceHandlerEx: SMM Performance Data buffer in SMRAM or overflow!\n")); Status = EFI_ACCESS_DENIED; break; } GaugeEntryExArray = (GAUGE_DATA_ENTRY_EX *) (mGaugeData + 1); - CopyMem( - (UINT8 *) GaugeDataEx, - (UINT8 *) &GaugeEntryExArray[LogEntryKey], - DataSize - ); + + for (Index = 0; Index < NumberOfEntries; Index++) { + CopyMem ( + (UINT8 *) &GaugeDataEx[Index], + (UINT8 *) &GaugeEntryExArray[LogEntryKey++], + sizeof (GAUGE_DATA_ENTRY_EX) + ); + } Status = EFI_SUCCESS; break; @@ -590,7 +594,7 @@ SmmPerformanceHandler ( EFI_STATUS Status; SMM_PERF_COMMUNICATE *SmmPerfCommData; GAUGE_DATA_ENTRY_EX *GaugeEntryExArray; - UINTN DataSize; + UINT64 DataSize; UINTN Index; GAUGE_DATA_ENTRY *GaugeData; UINTN NumberOfEntries; @@ -630,7 +634,7 @@ SmmPerformanceHandler ( NumberOfEntries = SmmPerfCommData->NumberOfEntries; LogEntryKey = SmmPerfCommData->LogEntryKey; if (GaugeData == NULL || NumberOfEntries == 0 || LogEntryKey > mGaugeData->NumberOfEntries || - NumberOfEntries > mGaugeData->NumberOfEntries || (LogEntryKey + NumberOfEntries) > mGaugeData->NumberOfEntries) { + NumberOfEntries > mGaugeData->NumberOfEntries || LogEntryKey > (mGaugeData->NumberOfEntries - NumberOfEntries)) { Status = EFI_INVALID_PARAMETER; break; } @@ -638,8 +642,8 @@ SmmPerformanceHandler ( // // Sanity check // - DataSize = NumberOfEntries * sizeof(GAUGE_DATA_ENTRY); - if (!SmmIsBufferOutsideSmmValid ((UINTN)GaugeData, DataSize)) { + DataSize = MultU64x32 (NumberOfEntries, sizeof(GAUGE_DATA_ENTRY)); + if (!SmmIsBufferOutsideSmmValid ((UINTN) GaugeData, DataSize)) { DEBUG ((EFI_D_ERROR, "SmmPerformanceHandler: SMM Performance Data buffer in SMRAM or overflow!\n")); Status = EFI_ACCESS_DENIED; break; @@ -648,7 +652,7 @@ SmmPerformanceHandler ( GaugeEntryExArray = (GAUGE_DATA_ENTRY_EX *) (mGaugeData + 1); for (Index = 0; Index < NumberOfEntries; Index++) { - CopyMem( + CopyMem ( (UINT8 *) &GaugeData[Index], (UINT8 *) &GaugeEntryExArray[LogEntryKey++], sizeof (GAUGE_DATA_ENTRY)