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)
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