GH-100942: Fix incorrect cast in property_copy(). (#100965)

This commit is contained in:
Raymond Hettinger 2023-01-12 16:13:56 -06:00 committed by GitHub
parent b511d3512b
commit 94fc7706b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 1 deletions

View File

@ -214,6 +214,23 @@ class PropertyTests(unittest.TestCase):
): ):
p.__set_name__(*([0] * i)) p.__set_name__(*([0] * i))
def test_property_setname_on_property_subclass(self):
# https://github.com/python/cpython/issues/100942
# Copy was setting the name field without first
# verifying that the copy was an actual property
# instance. As a result, the code below was
# causing a segfault.
class pro(property):
def __new__(typ, *args, **kwargs):
return "abcdef"
class A:
pass
p = property.__new__(pro)
p.__set_name__(A, 1)
np = p.getter(lambda self: 1)
# Issue 5890: subclasses of property do not preserve method __doc__ strings # Issue 5890: subclasses of property do not preserve method __doc__ strings
class PropertySub(property): class PropertySub(property):

View File

@ -0,0 +1,2 @@
Fixed segfault in property.getter/setter/deleter that occurred when a property
subclass overrode the ``__new__`` method to return a non-property instance.

View File

@ -1712,7 +1712,9 @@ property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del)
if (new == NULL) if (new == NULL)
return NULL; return NULL;
if (PyObject_TypeCheck((new), &PyProperty_Type)) {
Py_XSETREF(((propertyobject *) new)->prop_name, Py_XNewRef(pold->prop_name)); Py_XSETREF(((propertyobject *) new)->prop_name, Py_XNewRef(pold->prop_name));
}
return new; return new;
} }