Skip to content

Commit

Permalink
[3.12] pythongh-115618: Remove improper Py_XDECREFs in property metho…
Browse files Browse the repository at this point in the history
…ds (pythonGH-115619) (pythonGH-115620)

(cherry picked from commit 090dd21)
  • Loading branch information
serhiy-storchaka authored Feb 17, 2024
1 parent 2763f38 commit b9d1efa
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 3 deletions.
18 changes: 18 additions & 0 deletions Lib/test/test_property.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,24 @@ def test_refleaks_in___init__(self):
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)

@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_class_property(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -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`.
3 changes: 0 additions & 3 deletions Objects/descrobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1697,15 +1697,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) {
Expand Down

0 comments on commit b9d1efa

Please sign in to comment.