summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-02-26 23:28:24 (GMT)
committerGitHub <noreply@github.com>2022-02-26 23:28:24 (GMT)
commitad56919c5ed54523f866e6605a2573ab7b7d5235 (patch)
tree1cc23ffd1c3f58b123ff0936852a08bb86f32b88
parente182c660b63bc23420fb9f0593d77a3fa3b7f1c7 (diff)
downloadcpython-ad56919c5ed54523f866e6605a2573ab7b7d5235.zip
cpython-ad56919c5ed54523f866e6605a2573ab7b7d5235.tar.gz
cpython-ad56919c5ed54523f866e6605a2573ab7b7d5235.tar.bz2
bpo-46857: Fix refleak in OSError INIT_ALIAS() (GH-31594)
_Py_GetRefTotal() no longer decrements _PySet_Dummy refcount.
-rw-r--r--Lib/test/test_embed.py8
-rw-r--r--Objects/exceptions.c10
-rw-r--r--Objects/object.c7
3 files changed, 7 insertions, 18 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index 450bbec..80b9674 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 977dce5..9dbbd40 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 77a4572..38919ff 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