SmmLockBoxSmmLib is linked to SMM modules. If the module entry-point
function returns error, the module will be unloaded and the global
variables will point to undefined memory.

This patch is to add DESTRUCTOR SmmLockBoxSmmDestructor to uninstall
SmmLockBoxCommunication configuration table if it has been installed
in Constructor.

Cc: Jiewen Yao <jiewen....@intel.com>
Cc: Laszlo Ersek <ler...@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.z...@intel.com>
Reviewed-by: Jiewen Yao <jiewen....@intel.com>
---
 .../Library/SmmLockBoxLib/SmmLockBoxSmmLib.c       | 39 ++++++++++++++++++++++
 .../Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf     |  1 +
 2 files changed, 40 insertions(+)

diff --git a/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.c 
b/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.c
index 38be18560fe9..04afe54accb8 100644
--- a/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.c
+++ b/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.c
@@ -30,6 +30,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 SMM_LOCK_BOX_CONTEXT mSmmLockBoxContext;
 LIST_ENTRY           mLockBoxQueue = INITIALIZE_LIST_HEAD_VARIABLE 
(mLockBoxQueue);
 
+BOOLEAN              mSmmConfigurationTableInstalled = FALSE;
+
 /**
   This function return SmmLockBox context from SMST.
 
@@ -114,6 +116,7 @@ SmmLockBoxSmmConstructor (
                     sizeof(mSmmLockBoxContext)
                     );
   ASSERT_EFI_ERROR (Status);
+  mSmmConfigurationTableInstalled = TRUE;
 
   DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", 
(UINTN)&mSmmLockBoxContext));
   DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", 
(UINTN)&mLockBoxQueue));
@@ -123,6 +126,42 @@ SmmLockBoxSmmConstructor (
 }
 
 /**
+  Destructor for SmmLockBox library.
+  This is used to uninstall SmmLockBoxCommunication configuration table
+  if it has been installed in Constructor.
+
+  @param[in] ImageHandle  Image handle of this driver.
+  @param[in] SystemTable  A Pointer to the EFI System Table.
+
+  @retval EFI_SUCEESS     
+  @return Others          Some error occurs.
+**/
+EFI_STATUS
+EFIAPI
+SmmLockBoxSmmDestructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  EFI_STATUS           Status;
+
+  DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmDestructor in %a 
module\n", gEfiCallerBaseName));
+
+  if (mSmmConfigurationTableInstalled) {
+    Status = gSmst->SmmInstallConfigurationTable (
+                      gSmst,
+                      &gEfiSmmLockBoxCommunicationGuid,
+                      NULL,
+                      0
+                      );
+    ASSERT_EFI_ERROR (Status);
+    DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib uninstall SmmLockBoxCommunication 
configuration table\n"));
+  }
+
+  return Status;
+}
+
+/**
   This function return SmmLockBox queue address.
 
   @return SmmLockBox queue address.
diff --git a/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf 
b/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf
index d722f57a66bd..eb7ba0bb2e89 100644
--- a/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf
+++ b/MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf
@@ -23,6 +23,7 @@ [Defines]
   VERSION_STRING                 = 1.0
   LIBRARY_CLASS                  = LockBoxLib|DXE_SMM_DRIVER
   CONSTRUCTOR                    = SmmLockBoxSmmConstructor
+  DESTRUCTOR                     = SmmLockBoxSmmDestructor
 
 #
 # The following information is for reference only and not required by the 
build tools.
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to