Fix subinterpreter exception handling SEGFAULT (#5795)

* check for current exception, not uncaught_exceptions

* remove all in-flight exception handling from ~subinterpreter_scoped_activate
This commit is contained in:
Justen Di Ruscio
2025-08-15 04:03:03 -03:00
committed by GitHub
parent 90bc05c7ae
commit c1bf55a211

View File

@@ -280,28 +280,6 @@ inline subinterpreter_scoped_activate::~subinterpreter_scoped_activate() {
// We were on this interpreter already, so just make sure the GIL goes back as it was
PyGILState_Release(gil_state_);
} else {
#if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
bool has_active_exception;
# if defined(__cpp_lib_uncaught_exceptions)
has_active_exception = std::uncaught_exceptions() > 0;
# else
// removed in C++20, replaced with uncaught_exceptions
has_active_exception = std::uncaught_exception();
# endif
if (has_active_exception) {
try {
std::rethrow_exception(std::current_exception());
} catch (error_already_set &) {
// Because error_already_set holds python objects and what() acquires the GIL, it
// is basically never OK to let these exceptions propagate outside the current
// active interpreter.
pybind11_fail("~subinterpreter_scoped_activate: cannot propagate Python "
"exceptions outside of their owning interpreter");
} catch (...) {
}
}
#endif
if (tstate_) {
#if defined(PYBIND11_DETAILED_ERROR_MESSAGES)
if (detail::get_thread_state_unchecked() != tstate_) {