bpo-30057: Fix potential missed signal in signal.signal(). (GH-4258) (#4261)

Bug report and patch by Jeroen Demeyer.
(cherry picked from commit f6f90ff079)
This commit is contained in:
Miss Islington (bot) 2017-11-03 12:23:12 -07:00 committed by Antoine Pitrou
parent b5f09acf0a
commit ea80ae04e2
3 changed files with 6 additions and 1 deletions

View file

@ -358,6 +358,7 @@ Vincent Delft
Arnaud Delobelle Arnaud Delobelle
Konrad Delong Konrad Delong
Erik Demaine Erik Demaine
Jeroen Demeyer
Martin Dengler Martin Dengler
John Dennis John Dennis
L. Peter Deutsch L. Peter Deutsch

View file

@ -0,0 +1 @@
Fix potential missed signal in signal.signal().

View file

@ -462,12 +462,15 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
} }
else else
func = signal_handler; func = signal_handler;
/* Check for pending signals before changing signal handler */
if (PyErr_CheckSignals()) {
return NULL;
}
if (PyOS_setsig(signalnum, func) == SIG_ERR) { if (PyOS_setsig(signalnum, func) == SIG_ERR) {
PyErr_SetFromErrno(PyExc_OSError); PyErr_SetFromErrno(PyExc_OSError);
return NULL; return NULL;
} }
old_handler = Handlers[signalnum].func; old_handler = Handlers[signalnum].func;
_Py_atomic_store_relaxed(&Handlers[signalnum].tripped, 0);
Py_INCREF(handler); Py_INCREF(handler);
Handlers[signalnum].func = handler; Handlers[signalnum].func = handler;
if (old_handler != NULL) if (old_handler != NULL)