In last patch, we add code support to unregister SMI handler inside itself. However, the code doesn't support unregister SMI handler insider other SMI handler. While this is not a must-have usage. So add check to disallow unregister SMI handler in other SMI handler.
Cc: Liming Gao <gaolim...@byosoft.com.cn> Cc: Jiaxin Wu <jiaxin...@intel.com> Cc: Ray Ni <ray...@intel.com> Cc: Laszlo Ersek <ler...@redhat.com> Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> --- MdeModulePkg/Core/PiSmmCore/Smi.c | 32 +++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Core/PiSmmCore/Smi.c b/MdeModulePkg/Core/PiSmmCore/Smi.c index 3489c130fd..1bfbc635fc 100644 --- a/MdeModulePkg/Core/PiSmmCore/Smi.c +++ b/MdeModulePkg/Core/PiSmmCore/Smi.c @@ -8,7 +8,8 @@ #include "PiSmmCore.h" -LIST_ENTRY mSmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mSmiEntryList); +SMI_HANDLER *gCurrentSmiHandler = NULL; +LIST_ENTRY mSmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mSmiEntryList); SMI_ENTRY mRootSmiEntry = { SMI_ENTRY_SIGNATURE, @@ -142,13 +143,18 @@ SmiManage ( // Link points to may be freed if unregister SMI handler. // Link = Link->ForwardLink; - - Status = SmiHandler->Handler ( - (EFI_HANDLE)SmiHandler, - Context, - CommBuffer, - CommBufferSize - ); + // + // Assign gCurrentSmiHandle before calling the SMI handler and + // set to NULL when it returns. + // + gCurrentSmiHandler = SmiHandler; + Status = SmiHandler->Handler ( + (EFI_HANDLE)SmiHandler, + Context, + CommBuffer, + CommBufferSize + ); + gCurrentSmiHandler = NULL; switch (Status) { case EFI_INTERRUPT_PENDING: @@ -328,6 +334,16 @@ SmiHandlerUnRegister ( return EFI_INVALID_PARAMETER; } + // + // Check if unregister SMI handler inside a SMI Handler + // + if (gCurrentSmiHandler != NULL) { + // + // Only allow to unregister SMI Handler inside itself. + // + ASSERT (gCurrentSmiHandler == SmiHandler); + } + SmiEntry = SmiHandler->SmiEntry; RemoveEntryList (&SmiHandler->Link); -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116073): https://edk2.groups.io/g/devel/message/116073 Mute This Topic: https://groups.io/mt/104616993/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-