Skip to content

Commit aa0c080

Browse files
authored
bpo-1635741: Fix potential refleaks in binascii module (GH-18613)
1 parent 41fbf86 commit aa0c080

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed

Modules/binascii.c

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ typedef struct binascii_state {
6666
PyObject *Incomplete;
6767
} binascii_state;
6868

69+
static binascii_state *
70+
get_binascii_state(PyObject *module)
71+
{
72+
return (binascii_state *)PyModule_GetState(module);
73+
}
74+
6975
/*
7076
** hqx lookup table, ascii->binary.
7177
*/
@@ -1606,9 +1612,9 @@ static struct PyMethodDef binascii_module_methods[] = {
16061612
PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
16071613

16081614
static int
1609-
binascii_exec(PyObject *m) {
1615+
binascii_exec(PyObject *module) {
16101616
int result;
1611-
binascii_state *state = PyModule_GetState(m);
1617+
binascii_state *state = PyModule_GetState(module);
16121618
if (state == NULL) {
16131619
return -1;
16141620
}
@@ -1617,17 +1623,21 @@ binascii_exec(PyObject *m) {
16171623
if (state->Error == NULL) {
16181624
return -1;
16191625
}
1620-
result = PyModule_AddObject(m, "Error", state->Error);
1626+
Py_INCREF(state->Error);
1627+
result = PyModule_AddObject(module, "Error", state->Error);
16211628
if (result == -1) {
1629+
Py_DECREF(state->Error);
16221630
return -1;
16231631
}
16241632

16251633
state->Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
16261634
if (state->Incomplete == NULL) {
16271635
return -1;
16281636
}
1629-
result = PyModule_AddObject(m, "Incomplete", state->Incomplete);
1637+
Py_INCREF(state->Incomplete);
1638+
result = PyModule_AddObject(module, "Incomplete", state->Incomplete);
16301639
if (result == -1) {
1640+
Py_DECREF(state->Incomplete);
16311641
return -1;
16321642
}
16331643

@@ -1639,16 +1649,44 @@ static PyModuleDef_Slot binascii_slots[] = {
16391649
{0, NULL}
16401650
};
16411651

1652+
static int
1653+
binascii_traverse(PyObject *module, visitproc visit, void *arg)
1654+
{
1655+
binascii_state *state = get_binascii_state(module);
1656+
if (state) {
1657+
Py_VISIT(state->Error);
1658+
Py_VISIT(state->Incomplete);
1659+
}
1660+
return 0;
1661+
}
1662+
1663+
static int
1664+
binascii_clear(PyObject *module)
1665+
{
1666+
binascii_state *state = get_binascii_state(module);
1667+
if (state) {
1668+
Py_CLEAR(state->Error);
1669+
Py_CLEAR(state->Incomplete);
1670+
}
1671+
return 0;
1672+
}
1673+
1674+
static void
1675+
binascii_free(void *module)
1676+
{
1677+
binascii_clear((PyObject *)module);
1678+
}
1679+
16421680
static struct PyModuleDef binasciimodule = {
16431681
PyModuleDef_HEAD_INIT,
16441682
"binascii",
16451683
doc_binascii,
16461684
sizeof(binascii_state),
16471685
binascii_module_methods,
16481686
binascii_slots,
1649-
NULL,
1650-
NULL,
1651-
NULL
1687+
binascii_traverse,
1688+
binascii_clear,
1689+
binascii_free
16521690
};
16531691

16541692
PyMODINIT_FUNC

0 commit comments

Comments
 (0)