https://github.com/python/cpython/commit/fa70bf85931eff62cb24fb2f5b7e86c1dcf642d0
commit: fa70bf85931eff62cb24fb2f5b7e86c1dcf642d0
branch: main
author: Peter Bierma <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2025-04-21T14:09:34-07:00
summary:
gh-132747: Fix `NULL` dereference when calling a method's `__get__` manually
(#132772)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-04-21-07-39-59.gh-issue-132747.L-cnej.rst
M Lib/test/test_types.py
M Objects/descrobject.c
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index e5d80ee8eb7aca..3552b6b4ef846c 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -653,6 +653,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)
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-21-07-39-59.gh-issue-132747.L-cnej.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-21-07-39-59.gh-issue-132747.L-cnej.rst
new file mode 100644
index 00000000000000..c6d45b09f64519
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-21-07-39-59.gh-issue-132747.L-cnej.rst
@@ -0,0 +1,2 @@
+Fix a crash when calling :meth:`~object.__get__` of a :term:`method` with a
+:const:`None` second argument.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 268af0b217cd98..5ff36edd3ddb72 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -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,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]