mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
gh-132747: Fix NULL
dereference when calling a method's __get__
manually (#132772)
This commit is contained in:
parent
c8e0b6e684
commit
fa70bf8593
3 changed files with 22 additions and 1 deletions
|
@ -653,6 +653,25 @@ class TypesTests(unittest.TestCase):
|
|||
self.assertIsInstance(int.from_bytes, types.BuiltinMethodType)
|
||||
self.assertIsInstance(int.__new__, types.BuiltinMethodType)
|
||||
|
||||
def test_method_descriptor_crash(self):
|
||||
# gh-132747: The default __get__() implementation in C was unable
|
||||
# to handle a second argument of None when called from Python
|
||||
import _io
|
||||
import io
|
||||
import _queue
|
||||
|
||||
to_check = [
|
||||
# (method, instance)
|
||||
(_io._TextIOBase.read, io.StringIO()),
|
||||
(_queue.SimpleQueue.put, _queue.SimpleQueue()),
|
||||
(str.capitalize, "nobody expects the spanish inquisition")
|
||||
]
|
||||
|
||||
for method, instance in to_check:
|
||||
with self.subTest(method=method, instance=instance):
|
||||
bound = method.__get__(instance)
|
||||
self.assertIsInstance(bound, types.BuiltinMethodType)
|
||||
|
||||
def test_ellipsis_type(self):
|
||||
self.assertIsInstance(Ellipsis, types.EllipsisType)
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix a crash when calling :meth:`~object.__get__` of a :term:`method` with a
|
||||
:const:`None` second argument.
|
|
@ -145,7 +145,7 @@ method_get(PyObject *self, PyObject *obj, PyObject *type)
|
|||
return NULL;
|
||||
}
|
||||
if (descr->d_method->ml_flags & METH_METHOD) {
|
||||
if (PyType_Check(type)) {
|
||||
if (type == NULL || PyType_Check(type)) {
|
||||
return PyCMethod_New(descr->d_method, obj, NULL, descr->d_common.d_type);
|
||||
} else {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue