Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit aa0c080

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

File tree

1 file changed

+45
-7
lines changed
Filter options

1 file changed

+45
-7
lines changed

‎Modules/binascii.c

Copy file name to clipboardExpand all lines: Modules/binascii.c
+45-7Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.