diff options
author | Zhiguang Liu <zhiguang.liu@intel.com> | 2024-03-01 11:01:31 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-03-01 18:47:27 +0000 |
commit | 17b28722008eab745ce186b72cd325944cbe6bf0 (patch) | |
tree | d9ae8e42b3797656817bdf836c9b60a911161af1 | |
parent | ae1079b386a597108a8070652bf7cdaa4ec3dda3 (diff) | |
download | edk2-17b28722008eab745ce186b72cd325944cbe6bf0.zip edk2-17b28722008eab745ce186b72cd325944cbe6bf0.tar.gz edk2-17b28722008eab745ce186b72cd325944cbe6bf0.tar.bz2 |
MdeModulePkg/SMM: Disallow unregister SMI handler in other SMI handler
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 <gaoliming@byosoft.com.cn>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
Message-Id: <20240301030133.628-3-zhiguang.liu@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
-rw-r--r-- | MdeModulePkg/Core/PiSmmCore/Smi.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/MdeModulePkg/Core/PiSmmCore/Smi.c b/MdeModulePkg/Core/PiSmmCore/Smi.c index 3489c13..b3a81ac 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 *mCurrentSmiHandler = 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.
+ //
+ mCurrentSmiHandler = SmiHandler;
+ Status = SmiHandler->Handler (
+ (EFI_HANDLE)SmiHandler,
+ Context,
+ CommBuffer,
+ CommBufferSize
+ );
+ mCurrentSmiHandler = NULL;
switch (Status) {
case EFI_INTERRUPT_PENDING:
@@ -328,6 +334,13 @@ SmiHandlerUnRegister ( return EFI_INVALID_PARAMETER;
}
+ //
+ // Do not allow to unregister SMI Handler inside other SMI Handler
+ //
+ if ((mCurrentSmiHandler != NULL) && (mCurrentSmiHandler != SmiHandler)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
SmiEntry = SmiHandler->SmiEntry;
RemoveEntryList (&SmiHandler->Link);
|