diff options
author | Nikita Sobolev <mail@sobolevn.me> | 2023-01-15 07:08:59 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-15 07:08:59 (GMT) |
commit | b7b641a2ffaa0d370e73bed193b55aacb82f1069 (patch) | |
tree | 112ec953f84399ee8dd23a33a72c73f34781ab82 | |
parent | 78c9f39352a04e07ee4de7746c797ca79b5270d7 (diff) | |
download | cpython-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.py | 17 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2023-01-11-22-52-19.gh-issue-100942.ontOy_.rst | 2 | ||||
-rw-r--r-- | Objects/descrobject.c | 7 |
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; } |