]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-115618: Remove improper Py_XDECREFs in property methods (GH-115619)
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 17 Feb 2024 21:18:30 +0000 (23:18 +0200)
committerGitHub <noreply@github.com>
Sat, 17 Feb 2024 21:18:30 +0000 (23:18 +0200)
Lib/test/test_property.py
Misc/NEWS.d/next/Library/2024-02-17-18-47-12.gh-issue-115618.napiNp.rst [new file with mode: 0644]
Objects/descrobject.c

index 8ace9fd17ab96e7f4157ad1c26dc8c545df9fc3e..ad5ab5a87b5a663f45b6f468b45b1106c85eefc8 100644 (file)
@@ -183,6 +183,24 @@ class PropertyTests(unittest.TestCase):
             fake_prop.__init__('fget', 'fset', 'fdel', 'doc')
         self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)
 
+    @support.refcount_test
+    def test_gh_115618(self):
+        # Py_XDECREF() was improperly called for None argument
+        # in property methods.
+        gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount')
+        prop = property()
+        refs_before = gettotalrefcount()
+        for i in range(100):
+            prop = prop.getter(None)
+        self.assertIsNone(prop.fget)
+        for i in range(100):
+            prop = prop.setter(None)
+        self.assertIsNone(prop.fset)
+        for i in range(100):
+            prop = prop.deleter(None)
+        self.assertIsNone(prop.fdel)
+        self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)
+
     def test_property_set_name_incorrect_args(self):
         p = property()
 
diff --git a/Misc/NEWS.d/next/Library/2024-02-17-18-47-12.gh-issue-115618.napiNp.rst b/Misc/NEWS.d/next/Library/2024-02-17-18-47-12.gh-issue-115618.napiNp.rst
new file mode 100644 (file)
index 0000000..cb4b147
--- /dev/null
@@ -0,0 +1,3 @@
+Fix improper decreasing the reference count for ``None`` argument in
+:class:`property` methods :meth:`~property.getter`, :meth:`~property.setter`
+and :meth:`~property.deleter`.
index 805de2971ba475b4805d5c3a51e171d589a6e21b..c4cd51bdae45ab54a8be216a893b82704045cc82 100644 (file)
@@ -1730,15 +1730,12 @@ property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del)
         return NULL;
 
     if (get == NULL || get == Py_None) {
-        Py_XDECREF(get);
         get = pold->prop_get ? pold->prop_get : Py_None;
     }
     if (set == NULL || set == Py_None) {
-        Py_XDECREF(set);
         set = pold->prop_set ? pold->prop_set : Py_None;
     }
     if (del == NULL || del == Py_None) {
-        Py_XDECREF(del);
         del = pold->prop_del ? pold->prop_del : Py_None;
     }
     if (pold->getter_doc && get != Py_None) {