From 3a3274a6f721ec400f14ae566dfd796a8579fdde Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sun, 23 Feb 2020 15:28:08 +0800 Subject: [PATCH 1/2] Fix potential refleaks in binascii module --- Modules/binascii.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Modules/binascii.c b/Modules/binascii.c index e428b0d6f963f7..ba6916f4c6fb6e 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. */ @@ -1617,8 +1623,10 @@ binascii_exec(PyObject *m) { if (state->Error == NULL) { return -1; } + Py_INCREF(state->Error); result = PyModule_AddObject(m, "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; } + Py_INCREF(state->Incomplete); result = PyModule_AddObject(m, "Incomplete", state->Incomplete); if (result == -1) { + Py_DECREF(state->Incomplete); return -1; } @@ -1639,6 +1649,36 @@ static PyModuleDef_Slot binascii_slots[] = { {0, NULL} }; +static int +binascii_traverse(PyObject *m, visitproc visit, void *arg) +{ + binascii_state *state = get_binascii_state(m); + if (state == NULL) { + return -1; + } + Py_VISIT(state->Error); + Py_VISIT(state->Incomplete); + return 0; +} + +static int +binascii_clear(PyObject *m) +{ + binascii_state *state = get_binascii_state(m); + if (state == NULL) { + return -1; + } + Py_CLEAR(state->Error); + Py_CLEAR(state->Incomplete); + return 0; +} + +static void +binascii_free(void *m) +{ + binascii_clear((PyObject *)m); +} + static struct PyModuleDef binasciimodule = { PyModuleDef_HEAD_INIT, "binascii", @@ -1646,9 +1686,9 @@ static struct PyModuleDef binasciimodule = { sizeof(binascii_state), binascii_module_methods, binascii_slots, - NULL, - NULL, - NULL + binascii_traverse, + binascii_clear, + binascii_free }; PyMODINIT_FUNC From a2f1f99cafe2d49bfdfebaca811f475c090bb434 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sun, 1 Mar 2020 10:07:20 +0800 Subject: [PATCH 2/2] using the var name module to replace m --- Modules/binascii.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Modules/binascii.c b/Modules/binascii.c index ba6916f4c6fb6e..c63f3baf96a6a9 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1612,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; } @@ -1624,7 +1624,7 @@ binascii_exec(PyObject *m) { return -1; } Py_INCREF(state->Error); - result = PyModule_AddObject(m, "Error", state->Error); + result = PyModule_AddObject(module, "Error", state->Error); if (result == -1) { Py_DECREF(state->Error); return -1; @@ -1635,7 +1635,7 @@ binascii_exec(PyObject *m) { return -1; } Py_INCREF(state->Incomplete); - result = PyModule_AddObject(m, "Incomplete", state->Incomplete); + result = PyModule_AddObject(module, "Incomplete", state->Incomplete); if (result == -1) { Py_DECREF(state->Incomplete); return -1; @@ -1650,33 +1650,31 @@ static PyModuleDef_Slot binascii_slots[] = { }; static int -binascii_traverse(PyObject *m, visitproc visit, void *arg) +binascii_traverse(PyObject *module, visitproc visit, void *arg) { - binascii_state *state = get_binascii_state(m); - if (state == NULL) { - return -1; + binascii_state *state = get_binascii_state(module); + if (state) { + Py_VISIT(state->Error); + Py_VISIT(state->Incomplete); } - Py_VISIT(state->Error); - Py_VISIT(state->Incomplete); return 0; } static int -binascii_clear(PyObject *m) +binascii_clear(PyObject *module) { - binascii_state *state = get_binascii_state(m); - if (state == NULL) { - return -1; + binascii_state *state = get_binascii_state(module); + if (state) { + Py_CLEAR(state->Error); + Py_CLEAR(state->Incomplete); } - Py_CLEAR(state->Error); - Py_CLEAR(state->Incomplete); return 0; } static void -binascii_free(void *m) +binascii_free(void *module) { - binascii_clear((PyObject *)m); + binascii_clear((PyObject *)module); } static struct PyModuleDef binasciimodule = {