Skip to content

Conversation

llvmbot
Copy link
Member

@llvmbot llvmbot commented Oct 16, 2025

Backport a17afee

Requested by: @mstorsjo

@llvmbot llvmbot requested a review from a team as a code owner October 16, 2025 19:59
@llvmbot llvmbot added this to the LLVM 21.x Release milestone Oct 16, 2025
@github-project-automation github-project-automation bot moved this to Needs Triage in LLVM Release Status Oct 16, 2025
@llvmbot
Copy link
Member Author

llvmbot commented Oct 16, 2025

@cdavis5e What do you think about merging this PR to the release branch?

@llvmbot
Copy link
Member Author

llvmbot commented Oct 16, 2025

@llvm/pr-subscribers-libunwind

Author: None (llvmbot)

Changes

Backport a17afee

Requested by: @mstorsjo


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

1 Files Affected:

  • (modified) libunwind/src/Unwind-seh.cpp (+2-1)
diff --git a/libunwind/src/Unwind-seh.cpp b/libunwind/src/Unwind-seh.cpp
index 8b83f10615f22..110c5987c3f1a 100644
--- a/libunwind/src/Unwind-seh.cpp
+++ b/libunwind/src/Unwind-seh.cpp
@@ -174,7 +174,8 @@ _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

@mstorsjo mstorsjo requested a review from cjacek October 16, 2025 20:03
@github-project-automation github-project-automation bot moved this from Needs Triage to Needs Merge in LLVM Release Status Oct 16, 2025
…162867)

See LuaJIT/LuaJIT#593 (comment)
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->ContextRecord as we already have available.

Fixes: llvm#161851

Co-authored-by: Peter Cawley <[email protected]>
Co-authored-by: Hannes Domani <[email protected]>
(cherry picked from commit a17afee)
@c-rhodes c-rhodes merged commit 0d819a9 into llvm:release/21.x Oct 17, 2025
1 check was pending
@github-project-automation github-project-automation bot moved this from Needs Merge to Done in LLVM Release Status Oct 17, 2025
Copy link

@mstorsjo (or anyone else). If you would like to add a note about this fix in the release notes (completely optional). Please reply to this comment with a one or two sentence description of the fix. When you are done, please add the release:note label to this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Development

Successfully merging this pull request may close these issues.

4 participants