gh-143635: Fix crash in ga_repr_items_list (#143670)

This commit is contained in:
sobolevn 2026-01-15 06:50:47 +03:00 committed by GitHub
parent 794f758cd8
commit bdba5f0db2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 57 additions and 1 deletions

View File

@ -245,6 +245,56 @@ class BaseTest(unittest.TestCase):
self.assertEndsWith(repr(MyGeneric[[]]), 'MyGeneric[[]]')
self.assertEndsWith(repr(MyGeneric[[int, str]]), 'MyGeneric[[int, str]]')
def test_evil_repr1(self):
# gh-143635
class Zap:
def __init__(self, container):
self.container = container
def __getattr__(self, name):
if name == "__origin__":
self.container.clear()
return None
if name == "__args__":
return ()
raise AttributeError
params = []
params.append(Zap(params))
alias = GenericAlias(list, (params,))
repr_str = repr(alias)
self.assertTrue(repr_str.startswith("list[["), repr_str)
def test_evil_repr2(self):
class Zap:
def __init__(self, container):
self.container = container
def __getattr__(self, name):
if name == "__qualname__":
self.container.clear()
return "abcd"
if name == "__module__":
return None
raise AttributeError
params = []
params.append(Zap(params))
alias = GenericAlias(list, (params,))
repr_str = repr(alias)
self.assertTrue(repr_str.startswith("list[["), repr_str)
def test_evil_repr3(self):
# gh-143823
lst = []
class X:
def __repr__(self):
lst.clear()
return "x"
lst += [X(), 1]
ga = GenericAlias(int, lst)
with self.assertRaises(IndexError):
repr(ga)
def test_exposed_type(self):
import types
a = types.GenericAlias(list, int)

View File

@ -0,0 +1 @@
Fixes a crash in ``ga_repr_items_list`` function.

View File

@ -68,10 +68,15 @@ ga_repr_items_list(PyUnicodeWriter *writer, PyObject *p)
return -1;
}
}
PyObject *item = PyList_GET_ITEM(p, i);
PyObject *item = PyList_GetItemRef(p, i);
if (item == NULL) {
return -1; // list can be mutated in a callback
}
if (_Py_typing_type_repr(writer, item) < 0) {
Py_DECREF(item);
return -1;
}
Py_DECREF(item);
}
if (PyUnicodeWriter_WriteChar(writer, ']') < 0) {