Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fa70bf8

Browse filesBrowse files
gh-132747: Fix NULL dereference when calling a method's __get__ manually (#132772)
1 parent c8e0b6e commit fa70bf8
Copy full SHA for fa70bf8

File tree

Expand file treeCollapse file tree

3 files changed

+22
-1
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+22
-1
lines changed

‎Lib/test/test_types.py

Copy file name to clipboardExpand all lines: Lib/test/test_types.py
+19Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,25 @@ def test_method_descriptor_types(self):
653653
self.assertIsInstance(int.from_bytes, types.BuiltinMethodType)
654654
self.assertIsInstance(int.__new__, types.BuiltinMethodType)
655655

656+
def test_method_descriptor_crash(self):
657+
# gh-132747: The default __get__() implementation in C was unable
658+
# to handle a second argument of None when called from Python
659+
import _io
660+
import io
661+
import _queue
662+
663+
to_check = [
664+
# (method, instance)
665+
(_io._TextIOBase.read, io.StringIO()),
666+
(_queue.SimpleQueue.put, _queue.SimpleQueue()),
667+
(str.capitalize, "nobody expects the spanish inquisition")
668+
]
669+
670+
for method, instance in to_check:
671+
with self.subTest(method=method, instance=instance):
672+
bound = method.__get__(instance)
673+
self.assertIsInstance(bound, types.BuiltinMethodType)
674+
656675
def test_ellipsis_type(self):
657676
self.assertIsInstance(Ellipsis, types.EllipsisType)
658677

+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a crash when calling :meth:`~object.__get__` of a :term:`method` with a
2+
:const:`None` second argument.

‎Objects/descrobject.c

Copy file name to clipboardExpand all lines: Objects/descrobject.c
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ method_get(PyObject *self, PyObject *obj, PyObject *type)
145145
return NULL;
146146
}
147147
if (descr->d_method->ml_flags & METH_METHOD) {
148-
if (PyType_Check(type)) {
148+
if (type == NULL || PyType_Check(type)) {
149149
return PyCMethod_New(descr->d_method, obj, NULL, descr->d_common.d_type);
150150
} else {
151151
PyErr_Format(PyExc_TypeError,

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.