https://github.com/python/cpython/commit/43410953c26153b48554218cbe35ba5f1167b08e
commit: 43410953c26153b48554218cbe35ba5f1167b08e
branch: main
author: Max Bachmann <[email protected]>
committer: zooba <[email protected]>
date: 2025-05-15T11:59:11+01:00
summary:
gh-133572: Avoid using NTSTATUS on unsupported WinAPI partitions (GH-133573)
files:
A Misc/NEWS.d/next/Windows/2025-05-07-11-45-30.gh-issue-133572.Xc2zxH.rst
M Modules/mmapmodule.c
diff --git
a/Misc/NEWS.d/next/Windows/2025-05-07-11-45-30.gh-issue-133572.Xc2zxH.rst
b/Misc/NEWS.d/next/Windows/2025-05-07-11-45-30.gh-issue-133572.Xc2zxH.rst
new file mode 100644
index 00000000000000..993eceab0b79c2
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2025-05-07-11-45-30.gh-issue-133572.Xc2zxH.rst
@@ -0,0 +1 @@
+Avoid LsaNtStatus to WinError conversion on unsupported WinAPI partitions.
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 6a385562845849..7c4eb05488eb33 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -290,6 +290,24 @@ filter_page_exception_method(mmap_object *self,
EXCEPTION_POINTERS *ptrs,
}
return EXCEPTION_CONTINUE_SEARCH;
}
+
+static void
+_PyErr_SetFromNTSTATUS(ULONG status)
+{
+#if defined(MS_WINDOWS_DESKTOP) || defined(MS_WINDOWS_SYSTEM)
+ PyErr_SetFromWindowsErr(LsaNtStatusToWinError((NTSTATUS)status));
+#else
+ if (status & 0x80000000) {
+ // HRESULT-shaped codes are supported by PyErr_SetFromWindowsErr
+ PyErr_SetFromWindowsErr((int)status);
+ }
+ else {
+ // No mapping for NTSTATUS values, so just return it for diagnostic
purposes
+ // If we provide it as winerror it could incorrectly change the type
of the exception.
+ PyErr_Format(PyExc_OSError, "Operating system error NTSTATUS=0x%08lX",
status);
+ }
+#endif
+}
#endif
#if defined(MS_WINDOWS) && !defined(DONT_USE_SEH)
@@ -303,9 +321,7 @@ do {
\
assert(record.ExceptionCode == EXCEPTION_IN_PAGE_ERROR || \
record.ExceptionCode == EXCEPTION_ACCESS_VIOLATION); \
if (record.ExceptionCode == EXCEPTION_IN_PAGE_ERROR) { \
- NTSTATUS status = (NTSTATUS) record.ExceptionInformation[2]; \
- ULONG code = LsaNtStatusToWinError(status); \
- PyErr_SetFromWindowsErr(code); \
+ _PyErr_SetFromNTSTATUS((ULONG)record.ExceptionInformation[2]); \
} \
else if (record.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { \
PyErr_SetFromWindowsErr(ERROR_NOACCESS); \
@@ -332,9 +348,7 @@ do {
\
assert(record.ExceptionCode == EXCEPTION_IN_PAGE_ERROR || \
record.ExceptionCode == EXCEPTION_ACCESS_VIOLATION); \
if (record.ExceptionCode == EXCEPTION_IN_PAGE_ERROR) { \
- NTSTATUS status = (NTSTATUS) record.ExceptionInformation[2]; \
- ULONG code = LsaNtStatusToWinError(status); \
- PyErr_SetFromWindowsErr(code); \
+ _PyErr_SetFromNTSTATUS((ULONG)record.ExceptionInformation[2]); \
} \
else if (record.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { \
PyErr_SetFromWindowsErr(ERROR_NOACCESS); \
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]