bpo-38037: Fix reference counters in signal module (GH-15753)

(cherry picked from commit 77643c486f)

Co-authored-by: animalize <animalize@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2019-09-09 07:42:35 -07:00 committed by GitHub
parent 44729c9f51
commit b150d0bf1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 8 deletions

View File

@ -0,0 +1 @@
Fix reference counters in the :mod:`signal` module.

View File

@ -1329,7 +1329,7 @@ static struct PyModuleDef signalmodule = {
PyMODINIT_FUNC
PyInit__signal(void)
{
PyObject *m, *d, *x;
PyObject *m, *d;
int i;
/* Create the module and add the functions */
@ -1350,13 +1350,17 @@ PyInit__signal(void)
/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
if (PyModule_AddObject(m, "SIG_DFL", x))
DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
if (!DefaultHandler ||
PyDict_SetItemString(d, "SIG_DFL", DefaultHandler) < 0) {
goto finally;
}
x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
if (PyModule_AddObject(m, "SIG_IGN", x))
IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
if (!IgnoreHandler ||
PyDict_SetItemString(d, "SIG_IGN", IgnoreHandler) < 0) {
goto finally;
}
if (PyModule_AddIntMacro(m, NSIG))
goto finally;
@ -1374,8 +1378,8 @@ PyInit__signal(void)
goto finally;
#endif
x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
if (!x)
IntHandler = PyDict_GetItemString(d, "default_int_handler");
if (!IntHandler)
goto finally;
Py_INCREF(IntHandler);
@ -1568,8 +1572,10 @@ PyInit__signal(void)
#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
ItimerError = PyErr_NewException("signal.ItimerError",
PyExc_OSError, NULL);
if (PyModule_AddObject(m, "ItimerError", ItimerError))
if (!ItimerError ||
PyDict_SetItemString(d, "ItimerError", ItimerError) < 0) {
goto finally;
}
#endif
#ifdef CTRL_C_EVENT
@ -1615,6 +1621,9 @@ finisignal(void)
Py_CLEAR(IntHandler);
Py_CLEAR(DefaultHandler);
Py_CLEAR(IgnoreHandler);
#ifdef HAVE_GETITIMER
Py_CLEAR(ItimerError);
#endif
}