https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=0d73c040676a44829a9a3614b4013fa50fdc56e8

commit 0d73c040676a44829a9a3614b4013fa50fdc56e8
Author:     Corinna Vinschen <[email protected]>
AuthorDate: Mon Mar 31 12:24:34 2025 +0200
Commit:     Corinna Vinschen <[email protected]>
CommitDate: Mon Mar 31 12:24:34 2025 +0200

    Cygwin: exceptions: check ExceptionFlags for EXCEPTION_NONCONTINUABLE
    
    So far, exception::handle returned prematurely if the value of
    EXCEPTION_RECORD::ExceptionFlags was non-0.
    
    Starting with Windows 11 we're getting into trouble with that,
    if the exception is software generated, for instance by calling
    "throw" in a C++ application.
    
    In that case EXCEPTION_SOFTWARE_ORIGINATE (0x80) is set in
    EXCEPTION_RECORD::ExceptionFlags.
    
    Change the condition for exiting prematurely to do this only if
    any other flag except EXCEPTION_SOFTWARE_ORIGINATE is set in
    EXCEPTION_RECORD::ExceptionFlags.
    
    Fixes: Silent change in Windows exception handling
    Signed-off-by: Corinna Vinschen <[email protected]>

Diff:
---
 winsup/cygwin/exceptions.cc            | 2 +-
 winsup/cygwin/local_includes/winlean.h | 4 ++++
 winsup/cygwin/release/3.6.1            | 4 ++++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index a3aae2ce59df..49fc166ff5da 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -659,7 +659,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list 
*frame, CONTEXT *in,
 
   /* If we're exiting, tell Windows to keep looking for an
      exception handler.  */
-  if (exit_state || e->ExceptionFlags)
+  if (exit_state || (e->ExceptionFlags & ~EXCEPTION_SOFTWARE_ORIGINATE))
     return ExceptionContinueSearch;
 
   siginfo_t si = {};
diff --git a/winsup/cygwin/local_includes/winlean.h 
b/winsup/cygwin/local_includes/winlean.h
index 62b651be6ee7..500f56957aa9 100644
--- a/winsup/cygwin/local_includes/winlean.h
+++ b/winsup/cygwin/local_includes/winlean.h
@@ -111,6 +111,10 @@ details. */
 #define DOMAIN_ALIAS_RID_DEVICE_OWNERS         (__MSABI_LONG(0x00000247))
 #endif
 
+#ifndef EXCEPTION_SOFTWARE_ORIGINATE
+#define EXCEPTION_SOFTWARE_ORIGINATE           0x80
+#endif
+
 /* So-called "Microsoft Account" SIDs (S-1-11-...) have a netbios domain name
    "MicrosoftAccounts".  The new "Application Container SIDs" (S-1-15-...)
    have a netbios domain name "APPLICATION PACKAGE AUTHORITY"
diff --git a/winsup/cygwin/release/3.6.1 b/winsup/cygwin/release/3.6.1
index 7a6afe6b87e2..254cfdd9c74f 100644
--- a/winsup/cygwin/release/3.6.1
+++ b/winsup/cygwin/release/3.6.1
@@ -23,3 +23,7 @@ Fixes:
 
 - Disallow accounts from the BUILTIN, NT AUTHORITY, NT SERVICE domains
   as USER entry in a POSIX ACL.  Only allow USER_OBJ, GROUP_OBJ and GROUP.
+
+- Accommodate a change in Windows exception handling affecting software
+  generated exceptions.
+  Addresses: https://cygwin.com/pipermail/cygwin/2025-March/257808.html

Reply via email to