summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2021-04-30 17:26:45 +0100
committerGitHub <noreply@github.com>2021-04-30 17:26:45 +0100
commite374a40afa09be728b01653a06c9febfad9c9c50 (patch)
treea34aa1552de02d9349feb3cb062c534063cb5372
parent7dcf0f6db38b7ab6918608542d3a0c6da0a286af (diff)
downloadcpython-git-e374a40afa09be728b01653a06c9febfad9c9c50.tar.gz
bpo-43901: Fix refleaks in test_module (GH-25754)
-rw-r--r--Lib/test/test_module.py3
-rw-r--r--Objects/moduleobject.c15
2 files changed, 13 insertions, 5 deletions
diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py
index 0fd82ea713..65319d5dca 100644
--- a/Lib/test/test_module.py
+++ b/Lib/test/test_module.py
@@ -2,6 +2,7 @@
import unittest
import weakref
from test.support import gc_collect
+from test.support import import_helper
from test.support.script_helper import assert_python_ok
import sys
@@ -334,7 +335,7 @@ a = A(destroyed)"""
del foo.__annotations__
def test_annotations_are_created_correctly(self):
- from test import ann_module4
+ ann_module4 = import_helper.import_fresh_module('test.ann_module4')
self.assertTrue("__annotations__" in ann_module4.__dict__)
del ann_module4.__annotations__
self.assertFalse("__annotations__" in ann_module4.__dict__)
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 04346f7ad1..b69e5cedbb 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -845,6 +845,7 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
if ((dict == NULL) || !PyDict_Check(dict)) {
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
+ Py_XDECREF(dict);
return NULL;
}
@@ -876,25 +877,31 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
static int
module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored))
{
+ int ret = -1;
PyObject *dict = _PyObject_GetAttrId((PyObject *)m, &PyId___dict__);
if ((dict == NULL) || !PyDict_Check(dict)) {
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
- return -1;
+ goto exit;
}
if (value != NULL) {
/* set */
- return _PyDict_SetItemId(dict, &PyId___annotations__, value);
+ ret = _PyDict_SetItemId(dict, &PyId___annotations__, value);
+ goto exit;
}
/* delete */
if (!_PyDict_ContainsId(dict, &PyId___annotations__)) {
PyErr_Format(PyExc_AttributeError, "__annotations__");
- return -1;
+ goto exit;
}
- return _PyDict_DelItemId(dict, &PyId___annotations__);
+ ret = _PyDict_DelItemId(dict, &PyId___annotations__);
+
+exit:
+ Py_XDECREF(dict);
+ return ret;
}