summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2023-01-15 07:08:59 (GMT)
committerGitHub <noreply@github.com>2023-01-15 07:08:59 (GMT)
commitb7b641a2ffaa0d370e73bed193b55aacb82f1069 (patch)
tree112ec953f84399ee8dd23a33a72c73f34781ab82
parent78c9f39352a04e07ee4de7746c797ca79b5270d7 (diff)
downloadcpython-b7b641a2ffaa0d370e73bed193b55aacb82f1069.zip
cpython-b7b641a2ffaa0d370e73bed193b55aacb82f1069.tar.gz
cpython-b7b641a2ffaa0d370e73bed193b55aacb82f1069.tar.bz2
[3.10] GH-100942: Fix incorrect cast in property_copy(). (GH-100965). (#101009)
(cherry picked from commit 94fc7706b7bc3d57cdd6d15bf8e8c4499ae53a69) Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
-rw-r--r--Lib/test/test_property.py17
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-01-11-22-52-19.gh-issue-100942.ontOy_.rst2
-rw-r--r--Objects/descrobject.c7
3 files changed, 23 insertions, 3 deletions
diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py
index 7f3813f..4cd4283 100644
--- a/Lib/test/test_property.py
+++ b/Lib/test/test_property.py
@@ -214,6 +214,23 @@ class PropertyTests(unittest.TestCase):
):
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
class PropertySub(property):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-01-11-22-52-19.gh-issue-100942.ontOy_.rst b/Misc/NEWS.d/next/Core and Builtins/2023-01-11-22-52-19.gh-issue-100942.ontOy_.rst
new file mode 100644
index 0000000..daccea2
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-01-11-22-52-19.gh-issue-100942.ontOy_.rst
@@ -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.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index ee3ad1b..1b1487a 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1675,9 +1675,10 @@ property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del)
Py_DECREF(type);
if (new == NULL)
return NULL;
-
- Py_XINCREF(pold->prop_name);
- Py_XSETREF(((propertyobject *) new)->prop_name, pold->prop_name);
+ if (PyObject_TypeCheck((new), &PyProperty_Type)) {
+ Py_XINCREF(pold->prop_name);
+ Py_XSETREF(((propertyobject *) new)->prop_name, pold->prop_name);
+ }
return new;
}