On 06/06/16 12:38, Star Zeng wrote: > 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 <[email protected]> > Cc: Laszlo Ersek <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Star Zeng <[email protected]> > Reviewed-by: Jiewen Yao <[email protected]> > --- > .../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; > +}
The value returned above should be constant EFI_SUCCESS. Namely, if "mSmmConfigurationTableInstalled" is FALSE, then Status will never be assigned, and the function will return an indeterminate value. With that fix: Reviewed-by: Laszlo Ersek <[email protected]> > + > +/** > 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. > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

