diff options
author | Hai Shi <shihai1992@gmail.com> | 2020-03-11 16:50:52 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-11 16:50:52 (GMT) |
commit | aa0c0808efbfdee813d2829e49030c667da44e72 (patch) | |
tree | 53d0f98e137dbfc37af81e08bbcd9b6dc8428027 /Modules/binascii.c | |
parent | 41fbf865a35d4fb64f047f98dc24690cb0c170fd (diff) | |
download | cpython-aa0c0808efbfdee813d2829e49030c667da44e72.zip cpython-aa0c0808efbfdee813d2829e49030c667da44e72.tar.gz cpython-aa0c0808efbfdee813d2829e49030c667da44e72.tar.bz2 |
bpo-1635741: Fix potential refleaks in binascii module (GH-18613)
Diffstat (limited to 'Modules/binascii.c')
-rw-r--r-- | Modules/binascii.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/Modules/binascii.c b/Modules/binascii.c index e428b0d..c63f3ba 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 |