diff options
| author | Taylor Beebe <taylor.d.beebe@gmail.com> | 2024-08-28 00:34:35 +0300 |
|---|---|---|
| committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-09-13 06:58:46 +0300 |
| commit | 5000568969995293b529f49ea43726e2d0a9dcab (patch) | |
| tree | 846b74d6008791b58f9f7acd99d8b0cd38f407f2 /MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c | |
| parent | ac43bbacdef18a6fea6d978e096326ec0805885d (diff) | |
| download | edk2-5000568969995293b529f49ea43726e2d0a9dcab.tar.xz | |
MdePkg: Create Stack Check Lib
StackCheckLib contains the required functionality for initializing
the stack cookie value, checking the value, and triggering an interrupt
when a mismatch occurs. The stack cookie is a random value placed on the
stack between the stack variables and the return address so that
continuously writing past the stack variables will cause the stack cookie
to be overwritten. Before the function returns, the stack cookie value
will be checked and if there is a mismatch then StackCheckLib handles the
failure.
Because UEFI doesn't use the C runtime libraries provided by MSVC, the
stack check code is written in assembly within this library. GCC and
Clang compilers have built-in support for stack cookie checking, so this
library only handles failures.
Signed-off-by: Oliver Smith-Denny <osde@linux.microsoft.com>
Diffstat (limited to 'MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c')
| -rw-r--r-- | MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c b/MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c new file mode 100644 index 0000000000..406b2d0116 --- /dev/null +++ b/MdePkg/Library/StackCheckLib/StackCheckLibCommonMsvc.c @@ -0,0 +1,40 @@ +/** @file
+ Provides the required functionality for handling stack
+ cookie check failures for MSVC.
+
+ Copyright (c) Microsoft Corporation.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Base.h>
+
+#include <Library/DebugLib.h>
+#include <Library/BaseLib.h>
+#include <Library/StackCheckFailureHookLib.h>
+
+/**
+ Triggers an interrupt using the vector specified by PcdStackCookieExceptionVector
+**/
+VOID
+TriggerStackCookieInterrupt (
+ VOID
+ );
+
+VOID *__security_cookie = (VOID *)(UINTN)STACK_COOKIE_VALUE;
+
+/**
+ This function gets called when an MSVC generated stack cookie fails. This implementation calls into a platform
+ failure hook lib and then triggers the stack cookie interrupt.
+
+ @param[in] ActualCookieValue The value that was written onto the stack, corrupting the stack cookie.
+
+**/
+VOID
+StackCheckFailure (
+ VOID *ActualCookieValue
+ )
+{
+ DEBUG ((DEBUG_ERROR, "Stack cookie check failed at address 0x%llx!\n", RETURN_ADDRESS (0)));
+ StackCheckFailureHook (RETURN_ADDRESS (0));
+ TriggerStackCookieInterrupt ();
+}
|
