summaryrefslogtreecommitdiffstats
path: root/Modules/binascii.c
diff options
context:
space:
mode:
authorHai Shi <shihai1992@gmail.com>2020-03-11 16:50:52 (GMT)
committerGitHub <noreply@github.com>2020-03-11 16:50:52 (GMT)
commitaa0c0808efbfdee813d2829e49030c667da44e72 (patch)
tree53d0f98e137dbfc37af81e08bbcd9b6dc8428027 /Modules/binascii.c
parent41fbf865a35d4fb64f047f98dc24690cb0c170fd (diff)
downloadcpython-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.c52
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