[3.13] gh-132747: Fix NULL dereference when calling a method's __get__ manually (GH-132772) (#132786)

(cherry picked from commit fa70bf8593)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
Peter Bierma 2025-04-21 17:38:51 -04:00 committed by GitHub
parent d8b9011702
commit bb59fdec71
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 1 deletions

View file

@ -631,6 +631,25 @@ def test_method_descriptor_types(self):
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)

View file

@ -0,0 +1,2 @@
Fix a crash when calling :meth:`~object.__get__` of a :term:`method` with a
:const:`None` second argument.

View file

@ -144,7 +144,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,