Pushed: https://github.com/tianocore/edk2-platforms/commit/871ce77

-----Original Message-----
From: [email protected] <[email protected]> 
Sent: Friday, December 10, 2021 4:22 PM
To: [email protected]
Cc: Chiu, Chasel <[email protected]>; Desimone, Nathaniel L 
<[email protected]>; Liming Gao <[email protected]>; Dong, 
Eric <[email protected]>
Subject: [edk2-platforms][PATCH v2 1/1] MinPlatformPkg/TestPointCheckLib: Fix 
DMAR structure length calculation

From: Michael Kubacki <[email protected]>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3768

When processing DMAR structures of type
EFI_ACPI_DMAR_STRUCTURE_HEADER within the ACPI DMAR table, the code determines 
the structure length by subtracting the DMAR structure headers present from the 
overall DMAR ACPI table size.

The terminating condition is that the remaining total DMAR length is greater 
than zero. However, the current DMAR structure length is subtracted after the 
DMAR structure pointer has already been assigned to the next structure.

This change subtracts the current DMAR structure length before transitioning to 
the next structure.

The terminating condition is also updated to ensure the remaining size is at 
least as large as the expected structure header size.

Cc: Chasel Chiu <[email protected]>
Cc: Nate DeSimone <[email protected]>
Cc: Liming Gao <[email protected]>
Cc: Eric Dong <[email protected]>
Signed-off-by: Michael Kubacki <[email protected]>
---

Notes:
    V2 Changes:
    
    - Updated the terminating condition to ensure the remaining size
      is at least as large as the expected structure size.

 
Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckAcpiDmar.c 
     | 8 ++++----
 
Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDmaProtection.c
 | 4 ++--  
Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/PeiCheckDmaProtection.c
 | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckAcpiDmar.c
 
b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckAcpiDmar.c
index b2279966d8ed..e0b7aaa48527 100644
--- 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckAcpiDmar.c
+++ b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCh
+++ eckAcpiDmar.c
@@ -133,7 +133,7 @@ DumpAcpiDmar (
   //
   DmarLen  = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);
   DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
-  while (DmarLen > 0) {
+  while (DmarLen >= sizeof (*DmarStructHeader)) {
     switch (DmarStructHeader->Type) {
     case EFI_ACPI_DMAR_TYPE_DRHD:
       Drhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarStructHeader; @@ -204,8 +204,8 
@@ DumpAcpiDmar (
       DEBUG ((DEBUG_INFO, "\n"));
       break;
     }
-    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
*)DmarStructHeader + DmarStructHeader->Length);
     DmarLen         -= DmarStructHeader->Length;
+    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
+ *)DmarStructHeader + DmarStructHeader->Length);
   }
 }
 
@@ -220,7 +220,7 @@ CheckAcpiDmar (
     
   DmarLen  = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);
   DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
-  while (DmarLen > 0) {
+  while (DmarLen >= sizeof (*DmarStructHeader)) {
     switch (DmarStructHeader->Type) {
     case EFI_ACPI_DMAR_TYPE_DRHD:
       Drhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarStructHeader; @@ -232,8 +232,8 
@@ CheckAcpiDmar (
     default:
       break;
     }
-    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
*)DmarStructHeader + DmarStructHeader->Length);
     DmarLen         -= DmarStructHeader->Length;
+    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
+ *)DmarStructHeader + DmarStructHeader->Length);
   }
   return EFI_SUCCESS;
 }
\ No newline at end of file
diff --git 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDmaProtection.c
 
b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDmaProtection.c
index 10b44fe8b9b8..aba0985956f2 100644
--- 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDmaProtection.c
+++ b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCh
+++ eckDmaProtection.c
@@ -38,7 +38,7 @@ CheckDrhd (
   //
   DmarLen  = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);
   DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
-  while (DmarLen > 0) {
+  while (DmarLen >= sizeof (*DmarStructHeader)) {
     switch (DmarStructHeader->Type) {
     case EFI_ACPI_DMAR_TYPE_DRHD:
       Drhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarStructHeader; @@ -56,8 +56,8 @@ 
CheckDrhd (
     default:
       break;
     }
-    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
*)DmarStructHeader + DmarStructHeader->Length);
     DmarLen         -= DmarStructHeader->Length;
+    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
+ *)DmarStructHeader + DmarStructHeader->Length);
   }
 
   return EFI_SUCCESS;
diff --git 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/PeiCheckDmaProtection.c
 
b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/PeiCheckDmaProtection.c
index cb764b3633ef..5a18235eddf4 100644
--- 
a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/PeiCheckDmaProtection.c
+++ b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/PeiCh
+++ eckDmaProtection.c
@@ -36,7 +36,7 @@ CheckDrhd (
   //
   DmarLen  = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);
   DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
-  while (DmarLen > 0) {
+  while (DmarLen >= sizeof (*DmarStructHeader)) {
     switch (DmarStructHeader->Type) {
     case EFI_ACPI_DMAR_TYPE_DRHD:
       Drhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarStructHeader; @@ -61,8 +61,8 @@ 
CheckDrhd (
     default:
       break;
     }
-    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
*)DmarStructHeader + DmarStructHeader->Length);
     DmarLen         -= DmarStructHeader->Length;
+    DmarStructHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINT8 
+ *)DmarStructHeader + DmarStructHeader->Length);
   }
 
   return EFI_SUCCESS;
--
2.28.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#84773): https://edk2.groups.io/g/devel/message/84773
Mute This Topic: https://groups.io/mt/87649657/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to