https://github.com/python/cpython/commit/7befb46bb29319418d866d43a0c85b51598709e8
commit: 7befb46bb29319418d866d43a0c85b51598709e8
branch: 3.14
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-06-10T20:30:10Z
summary:
[3.14] gh-151278: Fix test_faulthandler on UBSan (#151279) (#151282)
gh-151278: Fix test_faulthandler on UBSan (#151279)
* Py_FatalError() no longer calls _PyFaulthandler_Fini() if it
doesn't hold the GIL.
* Skip test_faulthandler tests raising signals if run with UBSan.
* Enable test_faulthandler in GitHub Action "Reusable Sanitizer".
(cherry picked from commit e60c42dc3f5a8dd9b10bc9a8a028ef2765469650)
files:
M Lib/test/test_faulthandler.py
M Python/pylifecycle.c
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 371c63adce9412..9f4dbe7f866347 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -33,6 +33,11 @@
CURRENT_THREAD_HEADER = fr'{CURRENT_THREAD_ID} \(most recent call first\):'
+def skip_if_sanitizer_signal(signame):
+ return support.skip_if_sanitizer(f"TSAN/UBSan itercepts {signame}",
+ thread=True, ub=True)
+
+
def expected_traceback(lineno1, lineno2, header, min_count=1):
regex = header
regex += ' File "<string>", line %s in func\n' % lineno1
@@ -247,7 +252,7 @@ def test_fatal_error_c_thread(self):
func='faulthandler_fatal_error_thread',
py_fatal_error=True)
- @support.skip_if_sanitizer("TSAN itercepts SIGABRT", thread=True)
+ @skip_if_sanitizer_signal("SIGABRT")
def test_sigabrt(self):
self.check_fatal_error("""
import faulthandler
@@ -259,7 +264,7 @@ def test_sigabrt(self):
@unittest.skipIf(sys.platform == 'win32',
"SIGFPE cannot be caught on Windows")
- @support.skip_if_sanitizer("TSAN itercepts SIGFPE", thread=True)
+ @skip_if_sanitizer_signal("SIGFPE")
def test_sigfpe(self):
self.check_fatal_error("""
import faulthandler
@@ -271,7 +276,7 @@ def test_sigfpe(self):
@unittest.skipIf(_testcapi is None, 'need _testcapi')
@unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS')
- @support.skip_if_sanitizer("TSAN itercepts SIGBUS", thread=True)
+ @skip_if_sanitizer_signal("SIGBUS")
@skip_segfault_on_android
def test_sigbus(self):
self.check_fatal_error("""
@@ -286,7 +291,7 @@ def test_sigbus(self):
@unittest.skipIf(_testcapi is None, 'need _testcapi')
@unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL')
- @support.skip_if_sanitizer("TSAN itercepts SIGILL", thread=True)
+ @skip_if_sanitizer_signal("SIGILL")
@skip_segfault_on_android
def test_sigill(self):
self.check_fatal_error("""
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 6241d6ddca19cf..27f80cc4f614cd 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -3362,7 +3362,9 @@ fatal_error(int fd, int header, const char *prefix, const
char *msg,
This function already did its best to display a traceback.
Disable faulthandler to prevent writing a second traceback
on abort(). */
- _PyFaulthandler_Fini();
+ if (has_tstate_and_gil) {
+ _PyFaulthandler_Fini();
+ }
/* Check if the current Python thread hold the GIL */
if (has_tstate_and_gil) {
_______________________________________________
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]