llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libunwind

Author: Martin Storsjö (mstorsjo)

<details>
<summary>Changes</summary>

See https://github.com/LuaJIT/LuaJIT/issues/593#issuecomment-1717728494 for the 
original explanation of the problem.

In short; when a debugger is attached, there's a
function KiUserExceptionDispatcher in the stack that is being unwound. The 
function KiUserExceptionDispatcher contains a CONTEXT, with a copy of the 
context from where the exception was raised. When unwinding through this 
function, this whole CONTEXT gets restored.

This CONTEXT is what we receive a pointer to in the callbacks, as the ms_ctx 
pointer.

When we unwind manually using RtlUnwindEx, the unwinding overwrites the CONTEXT 
that is passed to it. Thus, to avoid clobbering the CONTEXT that needs to be 
restored by KiUserExceptionDispatcher, we could either declare a new temporary 
CONTEXT on the stack before calling RtlUnwindEx, or just use 
disp-&gt;ContextRecord as we already have available.

Fixes: https://github.com/llvm/llvm-project/issues/161851

---
Full diff: https://github.com/llvm/llvm-project/pull/162867.diff


1 Files Affected:

- (modified) libunwind/src/Unwind-seh.cpp (+1-1) 


``````````diff
diff --git a/libunwind/src/Unwind-seh.cpp b/libunwind/src/Unwind-seh.cpp
index 8b83f10615f22..058369acf3360 100644
--- a/libunwind/src/Unwind-seh.cpp
+++ b/libunwind/src/Unwind-seh.cpp
@@ -174,7 +174,7 @@ _GCC_specific_handler(PEXCEPTION_RECORD ms_exc, PVOID 
frame, PCONTEXT ms_ctx,
     }
     // FIXME: Indicate target frame in foreign case!
     // phase 2: the clean up phase
-    RtlUnwindEx(frame, (PVOID)disp->ControlPc, ms_exc, exc, ms_ctx, 
disp->HistoryTable);
+    RtlUnwindEx(frame, (PVOID)disp->ControlPc, ms_exc, exc, 
disp->ContextRecord, disp->HistoryTable);
     _LIBUNWIND_ABORT("RtlUnwindEx() failed");
   case _URC_INSTALL_CONTEXT: {
     // If we were called by __libunwind_seh_personality(), indicate that

``````````

</details>


https://github.com/llvm/llvm-project/pull/162867
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to