[Python-checkins] bpo-1635741: Fix potential refleaks in binascii module (GH-18613)
Hai Shi
webhook-mailer at python.org
Wed Mar 11 12:51:00 EDT 2020
https://github.com/python/cpython/commit/aa0c0808efbfdee813d2829e49030c667da44e72
commit: aa0c0808efbfdee813d2829e49030c667da44e72
branch: master
author: Hai Shi <shihai1992 at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-03-11T17:50:52+01:00
summary:
bpo-1635741: Fix potential refleaks in binascii module (GH-18613)
files:
M Modules/binascii.c
diff --git a/Modules/binascii.c b/Modules/binascii.c
index e428b0d6f963f..c63f3baf96a6a 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
More information about the Python-checkins
mailing list