Closed
Description
When specializing LOAD_ATTR_SLOT
, we don't check whether the given member descriptor is valid for the type we got it from.
Here is a problematic example, where one class "borrows" a slot from another:
>>> class Class: ... __slots__ = ("slot",) ... >>> class Sneaky: ... borrowed = Class.slot ... >>> def f(o): ... return o.borrowed ... >>> o = Sneaky()
The unspecialized code behaves correctly:
>>> f(o) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f TypeError: descriptor 'slot' for 'Class' objects doesn't apply to a 'Sneaky' object
However, the specialized code crashes, since it is accessing memory past the end of the object:
>>> f(o) Segmentation fault
We can fix this by performing the same check that the member descriptor performs (PyObject_TypeCheck(obj, descr->d_type)
) when specializing.
CC @markshannon
Metadata
Metadata
Assignees
Labels
Projects
Status
Done