From e374a40afa09be728b01653a06c9febfad9c9c50 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 30 Apr 2021 17:26:45 +0100 Subject: bpo-43901: Fix refleaks in test_module (GH-25754) --- Lib/test/test_module.py | 3 ++- Objects/moduleobject.c | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py index 0fd82ea..65319d5 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 04346f7..b69e5ce 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, ".__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, ".__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; } -- cgit v0.12