GH-102397: Fix segfault from race condition in signal handling (GH-102399)
(cherry picked from commit
1a84cc007e207f2dd61f86a7fc3d86632fdce72f)
Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
signal.raise_signal(signal.SIGINT)
self.assertTrue(is_ok)
+ def test__thread_interrupt_main(self):
+ # See https://github.com/python/cpython/issues/102397
+ code = """if 1:
+ import _thread
+ class Foo():
+ def __del__(self):
+ _thread.interrupt_main()
+
+ x = Foo()
+ """
+
+ rc, out, err = assert_python_ok('-c', code)
+ self.assertIn(b'OSError: Signal 2 ignored due to race condition', err)
+
+
class PidfdSignalTest(unittest.TestCase):
--- /dev/null
+Fix segfault from race condition in signal handling during garbage collection.
+Patch by Kumar Aditya.
static inline int
compare_handler(PyObject *func, PyObject *dfl_ign_handler)
{
+ // See https://github.com/python/cpython/pull/102399
+ if (func == NULL || dfl_ign_handler == NULL) {
+ return 0;
+ }
assert(PyLong_CheckExact(dfl_ign_handler));
if (!PyLong_CheckExact(func)) {
return 0;