From: Victor Stinner Date: Sat, 26 Feb 2022 23:28:24 +0000 (+0100) Subject: bpo-46857: Fix refleak in OSError INIT_ALIAS() (GH-31594) X-Git-Tag: v3.11.0a6~69 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ad56919c5ed54523f866e6605a2573ab7b7d5235;p=thirdparty%2FPython%2Fcpython.git bpo-46857: Fix refleak in OSError INIT_ALIAS() (GH-31594) _Py_GetRefTotal() no longer decrements _PySet_Dummy refcount. --- diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 450bbec7005a..80b9674c1c25 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -1657,15 +1657,11 @@ class MiscTests(EmbeddingTestsMixin, unittest.TestCase): self.fail(f"unexpected output: {out!a}") refs = int(match.group(1)) blocks = int(match.group(2)) + self.assertEqual(refs, 0, out) if not MS_WINDOWS: - # bpo-46417: Tolerate negative reference count which can occur because - # of bugs in C extensions. It is only wrong if it's greater than 0. - self.assertLessEqual(refs, 0, out) self.assertEqual(blocks, 0, out) else: - # bpo-46857: on Windows, Python still leaks 1 reference and 1 - # memory block at exit. - self.assertLessEqual(refs, 1, out) + # bpo-46857: on Windows, Python still leaks 1 memory block at exit self.assertIn(blocks, (0, 1), out) diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 977dce502038..9dbbd40f1de1 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -15,10 +15,10 @@ /* Compatibility aliases */ -PyObject *PyExc_EnvironmentError = NULL; -PyObject *PyExc_IOError = NULL; +PyObject *PyExc_EnvironmentError = NULL; // borrowed ref +PyObject *PyExc_IOError = NULL; // borrowed ref #ifdef MS_WINDOWS -PyObject *PyExc_WindowsError = NULL; +PyObject *PyExc_WindowsError = NULL; // borrowed ref #endif @@ -3647,10 +3647,8 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) #define INIT_ALIAS(NAME, TYPE) \ do { \ - Py_INCREF(PyExc_ ## TYPE); \ - Py_XDECREF(PyExc_ ## NAME); \ PyExc_ ## NAME = PyExc_ ## TYPE; \ - if (PyDict_SetItemString(mod_dict, # NAME, PyExc_ ## NAME)) { \ + if (PyDict_SetItemString(mod_dict, # NAME, PyExc_ ## TYPE)) { \ return -1; \ } \ } while (0) diff --git a/Objects/object.c b/Objects/object.c index 77a457223764..38919ff47a94 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -61,12 +61,7 @@ Py_ssize_t _Py_RefTotal; Py_ssize_t _Py_GetRefTotal(void) { - PyObject *o; - Py_ssize_t total = _Py_RefTotal; - o = _PySet_Dummy; - if (o != NULL) - total -= Py_REFCNT(o); - return total; + return _Py_RefTotal; } void