From: Antoine Pitrou Date: Fri, 3 Nov 2017 18:58:46 +0000 (+0100) Subject: bpo-30057: Fix potential missed signal in signal.signal(). (#4258) X-Git-Tag: v3.7.0a3~251 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f6f90ff079a22b79a58d47b6117cc8a8c7d366f3;p=thirdparty%2FPython%2Fcpython.git bpo-30057: Fix potential missed signal in signal.signal(). (#4258) Bug report and patch by Jeroen Demeyer. --- diff --git a/Misc/ACKS b/Misc/ACKS index 1bd3c047d89a..05113903f06d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -362,6 +362,7 @@ Vincent Delft Arnaud Delobelle Konrad Delong Erik Demaine +Jeroen Demeyer Martin Dengler John Dennis L. Peter Deutsch diff --git a/Misc/NEWS.d/next/Library/2017-11-03-19-11-43.bpo-30057.NCaijI.rst b/Misc/NEWS.d/next/Library/2017-11-03-19-11-43.bpo-30057.NCaijI.rst new file mode 100644 index 000000000000..5740eb2500f2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-11-03-19-11-43.bpo-30057.NCaijI.rst @@ -0,0 +1 @@ +Fix potential missed signal in signal.signal(). diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index d470727fb629..1023244b6266 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -461,12 +461,15 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) } else func = signal_handler; + /* Check for pending signals before changing signal handler */ + if (PyErr_CheckSignals()) { + return NULL; + } if (PyOS_setsig(signalnum, func) == SIG_ERR) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } old_handler = Handlers[signalnum].func; - _Py_atomic_store_relaxed(&Handlers[signalnum].tripped, 0); Py_INCREF(handler); Handlers[signalnum].func = handler; if (old_handler != NULL)