diff --git a/Modules/binascii.c b/Modules/binascii.c index e428b0d6f963f7..c63f3baf96a6a9 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -66,6 +66,12 @@ typedef struct binascii_state { PyObject *Incomplete; } binascii_state; +static binascii_state * +get_binascii_state(PyObject *module) +{ + return (binascii_state *)PyModule_GetState(module); +} + /* ** hqx lookup table, ascii->binary. */ @@ -1606,9 +1612,9 @@ static struct PyMethodDef binascii_module_methods[] = { PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII"); static int -binascii_exec(PyObject *m) { +binascii_exec(PyObject *module) { int result; - binascii_state *state = PyModule_GetState(m); + binascii_state *state = PyModule_GetState(module); if (state == NULL) { return -1; } @@ -1617,8 +1623,10 @@ binascii_exec(PyObject *m) { if (state->Error == NULL) { return -1; } - result = PyModule_AddObject(m, "Error", state->Error); + Py_INCREF(state->Error); + result = PyModule_AddObject(module, "Error", state->Error); if (result == -1) { + Py_DECREF(state->Error); return -1; } @@ -1626,8 +1634,10 @@ binascii_exec(PyObject *m) { if (state->Incomplete == NULL) { return -1; } - result = PyModule_AddObject(m, "Incomplete", state->Incomplete); + Py_INCREF(state->Incomplete); + result = PyModule_AddObject(module, "Incomplete", state->Incomplete); if (result == -1) { + Py_DECREF(state->Incomplete); return -1; } @@ -1639,6 +1649,34 @@ static PyModuleDef_Slot binascii_slots[] = { {0, NULL} }; +static int +binascii_traverse(PyObject *module, visitproc visit, void *arg) +{ + binascii_state *state = get_binascii_state(module); + if (state) { + Py_VISIT(state->Error); + Py_VISIT(state->Incomplete); + } + return 0; +} + +static int +binascii_clear(PyObject *module) +{ + binascii_state *state = get_binascii_state(module); + if (state) { + Py_CLEAR(state->Error); + Py_CLEAR(state->Incomplete); + } + return 0; +} + +static void +binascii_free(void *module) +{ + binascii_clear((PyObject *)module); +} + static struct PyModuleDef binasciimodule = { PyModuleDef_HEAD_INIT, "binascii", @@ -1646,9 +1684,9 @@ static struct PyModuleDef binasciimodule = { sizeof(binascii_state), binascii_module_methods, binascii_slots, - NULL, - NULL, - NULL + binascii_traverse, + binascii_clear, + binascii_free }; PyMODINIT_FUNC
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: