https://git.reactos.org/?p=reactos.git;a=commitdiff;h=aa46e0f0a7471dc86ec9118fa0f83736dd9de420

commit aa46e0f0a7471dc86ec9118fa0f83736dd9de420
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Fri Jan 31 11:30:50 2025 +0200
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Tue Feb 4 09:00:35 2025 +0200

    [RTL/x64] Fix a bug in RtlpUnwindInternal
    
    Check if the stack pointer is out of bounds, before trying to unwind a 
frame. This will not fix any crashes, but it prevents simple crashes from going 
into a recursive exception.
---
 sdk/lib/rtl/amd64/unwind.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/sdk/lib/rtl/amd64/unwind.c b/sdk/lib/rtl/amd64/unwind.c
index 72393b9404b..3a438390cb6 100644
--- a/sdk/lib/rtl/amd64/unwind.c
+++ b/sdk/lib/rtl/amd64/unwind.c
@@ -649,6 +649,18 @@ Exit:
     return NULL;
 }
 
+static __inline
+BOOL
+RtlpIsStackPointerValid(
+    _In_ ULONG64 StackPointer,
+    _In_ ULONG64 LowLimit,
+    _In_ ULONG64 HighLimit)
+{
+    return (StackPointer >= LowLimit) &&
+           (StackPointer < HighLimit) &&
+           ((StackPointer & 7) == 0);
+}
+
 /*!
     \remark The implementation is based on the description in this blog: 
http://www.nynaeve.net/?p=106
 
@@ -699,6 +711,11 @@ RtlpUnwindInternal(
     /* Start looping */
     while (TRUE)
     {
+        if (!RtlpIsStackPointerValid(UnwindContext.Rsp, StackLow, StackHigh))
+        {
+            return FALSE;
+        }
+
         /* Lookup the FunctionEntry for the current RIP */
         FunctionEntry = RtlLookupFunctionEntry(UnwindContext.Rip, &ImageBase, 
NULL);
         if (FunctionEntry == NULL)

Reply via email to