Skip to content

Commit e858ea7

Browse files
committed
Also make __class_getitem__ safer
1 parent 5aeebab commit e858ea7

2 files changed

Lines changed: 12 additions & 8 deletions

File tree

Objects/typeobject.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3492,13 +3492,18 @@ static PyObject *
34923492
generic_subscript(PyTypeObject *tp, PyObject *key)
34933493
{
34943494
PyObject* stack[2] = {(PyObject *)tp, key};
3495-
PyObject *meth = PyObject_GetAttrString((PyObject *)tp, "__class_getitem__");
34963495
const char* msg = "'%.200s' object is not subscriptable";
3497-
if (meth){
3496+
PyObject *meth = PyObject_GetAttrString((PyObject *)tp, "__class_getitem__");
3497+
if (meth) {
3498+
if (!PyCallable_Check(meth)) {
3499+
PyErr_SetString(PyExc_TypeError,
3500+
"__class_getitem__ must be callable");
3501+
return NULL;
3502+
}
34983503
return _PyObject_FastCall(meth, stack, 2);
34993504
}
3500-
else{
3501-
if (PyErr_ExceptionMatches(PyExc_AttributeError)){
3505+
else {
3506+
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
35023507
PyErr_Clear();
35033508
PyErr_Format(PyExc_TypeError, msg, ((PyObject *)tp)->ob_type->tp_name);
35043509
return NULL;

Python/bltinmodule.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ update_bases(PyObject* bases, PyObject** args, int nargs, int* modified_bases)
5353
PyObject *new_bases;
5454
assert(PyTuple_Check(bases));
5555

56-
/* We have a separate cycle to calculate replacements with the idea that
56+
/* We have a separate cycle to calculate replacements with the idea that in
5757
most cases we just scroll quickly though it and return original bases */
5858
for (i = 2; i < nargs; i++){
5959
PyObject *base, *new_base, *new_base_meth;
@@ -73,9 +73,8 @@ update_bases(PyObject* bases, PyObject** args, int nargs, int* modified_bases)
7373
}
7474
else {
7575
if (!PyCallable_Check(new_base_meth)) {
76-
PyErr_Format(PyExc_TypeError,
77-
"attribute of type '%.200s' is not callable",
78-
Py_TYPE(new_base_meth)->tp_name);
76+
PyErr_SetString(PyExc_TypeError,
77+
"__base_subclass__ must be callable");
7978
return NULL;
8079
}
8180
stack[0] = bases;

0 commit comments

Comments
 (0)