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 = { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy