In last patch, we add code support to unregister MMI handler inside itself. However, the code doesn't support unregister MMI handler insider other MMI handler. While this is not a must-have usage. So add check to disallow unregister MMI handler in other MMI 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> Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org> Cc: Sami Mujawar <sami.muja...@arm.com> Cc: Ray Ni <ray...@intel.com> Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> --- StandaloneMmPkg/Core/Mmi.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/StandaloneMmPkg/Core/Mmi.c b/StandaloneMmPkg/Core/Mmi.c index c1a1d76e85..54794c6b3d 100644 --- a/StandaloneMmPkg/Core/Mmi.c +++ b/StandaloneMmPkg/Core/Mmi.c @@ -36,8 +36,9 @@ typedef struct { MMI_ENTRY *MmiEntry; } MMI_HANDLER; -LIST_ENTRY mRootMmiHandlerList = INITIALIZE_LIST_HEAD_VARIABLE (mRootMmiHandlerList); -LIST_ENTRY mMmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mMmiEntryList); +LIST_ENTRY mRootMmiHandlerList = INITIALIZE_LIST_HEAD_VARIABLE (mRootMmiHandlerList); +LIST_ENTRY mMmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mMmiEntryList); +MMI_HANDLER *gCurrentMmiHandler = NULL; /** Finds the MMI entry for the requested handler type. @@ -161,13 +162,19 @@ MmiManage ( // get next node before handler is executed, since LIST_ENTRY that // Link points to may be freed if unregister MMI handler. // - Link = Link->ForwardLink; - Status = MmiHandler->Handler ( - (EFI_HANDLE)MmiHandler, - Context, - CommBuffer, - CommBufferSize - ); + Link = Link->ForwardLink; + // + // Assign gCurrentMmiHandle before calling the MMI handler and + // set to NULL when it returns. + // + gCurrentMmiHandler = MmiHandler; + Status = MmiHandler->Handler ( + (EFI_HANDLE)MmiHandler, + Context, + CommBuffer, + CommBufferSize + ); + gCurrentMmiHandler = NULL; switch (Status) { case EFI_INTERRUPT_PENDING: @@ -314,6 +321,16 @@ MmiHandlerUnRegister ( return EFI_INVALID_PARAMETER; } + // + // Check if unregister MMI handler inside a MMI Handler + // + if (gCurrentMmiHandler != NULL) { + // + // Only allow to unregister MMI Handler inside itself. + // + ASSERT (gCurrentMmiHandler == MmiHandler); + } + MmiEntry = MmiHandler->MmiEntry; RemoveEntryList (&MmiHandler->Link); -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116075): https://edk2.groups.io/g/devel/message/116075 Mute This Topic: https://groups.io/mt/104616995/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-