mirror of
https://github.com/python/cpython
synced 2024-10-14 22:28:32 +00:00
GH-102397: Fix segfault from race condition in signal handling (#102399)
Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
parent
061325e0d2
commit
1a84cc007e
|
@ -1406,6 +1406,21 @@ def handler(a, b):
|
||||||
signal.raise_signal(signal.SIGINT)
|
signal.raise_signal(signal.SIGINT)
|
||||||
self.assertTrue(is_ok)
|
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):
|
class PidfdSignalTest(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix segfault from race condition in signal handling during garbage collection.
|
||||||
|
Patch by Kumar Aditya.
|
|
@ -148,6 +148,10 @@ get_signal_state(PyObject *module)
|
||||||
static inline int
|
static inline int
|
||||||
compare_handler(PyObject *func, PyObject *dfl_ign_handler)
|
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));
|
assert(PyLong_CheckExact(dfl_ign_handler));
|
||||||
if (!PyLong_CheckExact(func)) {
|
if (!PyLong_CheckExact(func)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue