]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43901: Fix refleaks in test_module (GH-25754)
authorPablo Galindo <Pablogsal@gmail.com>
Fri, 30 Apr 2021 16:26:45 +0000 (17:26 +0100)
committerGitHub <noreply@github.com>
Fri, 30 Apr 2021 16:26:45 +0000 (17:26 +0100)
Lib/test/test_module.py
Objects/moduleobject.c

index 0fd82ea713f7cef1d285371335bfd421a7f88a66..65319d5dca6d5d9551f4958053bf8d8703655def 100644 (file)
@@ -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__)
index 04346f7ad10675406f52d91ffbe1806d154a7430..b69e5cedbb5f36456ad50bfddfb11a25ff7ce6ed 100644 (file)
@@ -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;
 }