]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Prevent infinite recursion when ASSERT(), DEBUG(), or any other use of ReportStatusCo...
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 10 Nov 2010 06:12:25 +0000 (06:12 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 10 Nov 2010 06:12:25 +0000 (06:12 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11022 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c

index cf1f74c26c1b31634ac842186c3068973f58080f..af788cd4c906e395633389451edc5046d106c389 100644 (file)
@@ -487,6 +487,8 @@ ReportStatusCodeEx (
 {\r
   EFI_STATUS            Status;\r
   EFI_STATUS_CODE_DATA  *StatusCodeData;\r
+  EFI_TPL               Tpl;\r
+  UINT64                Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)];\r
 \r
   ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0)));\r
   ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0)));\r
@@ -496,12 +498,32 @@ ReportStatusCodeEx (
   }\r
 \r
   //\r
-  // Allocate space for the Status Code Header and its buffer\r
+  // Retrieve the current TPL\r
   //\r
+  Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+  gBS->RestoreTPL (Tpl);\r
+  \r
   StatusCodeData = NULL;\r
-  gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+  if (Tpl <= TPL_NOTIFY) {\r
+    //\r
+    // Allocate space for the Status Code Header and its buffer\r
+    //\r
+    gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+  }\r
+\r
   if (StatusCodeData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    //\r
+    // If a buffer could not be allocated, then see if the local variable Buffer can be used\r
+    //\r
+    if (ExtendedDataSize > (EFI_STATUS_CODE_DATA_MAX_SIZE - sizeof (EFI_STATUS_CODE_DATA))) {\r
+      //\r
+      // The local variable Buffer not large enough to hold the extended data associated\r
+      // with the status code being reported.\r
+      //\r
+      ASSERT (FALSE);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    StatusCodeData = (EFI_STATUS_CODE_DATA  *)Buffer;\r
   }\r
 \r
   //\r
@@ -532,7 +554,9 @@ ReportStatusCodeEx (
   //\r
   // Free the allocated buffer\r
   //\r
-  gBS->FreePool (StatusCodeData);\r
+  if (StatusCodeData != (EFI_STATUS_CODE_DATA  *)Buffer) {\r
+    gBS->FreePool (StatusCodeData);\r
+  }\r
 \r
   return Status;\r
 }\r