""" | |
The gc module can still invoke arbitrary Python code and crash. | |
This is an attack against _PyInstance_Lookup(), which is documented | |
as follows: | |
The point of this routine is that it never calls arbitrary Python | |
code, so is always "safe": all it does is dict lookups. | |
But of course dict lookups can call arbitrary Python code. | |
The following code causes mutation of the object graph during | |
the call to has_finalizer() in gcmodule.c, and that might | |
segfault. | |
""" | |
import gc | |
class A: | |
def __hash__(self): | |
return hash("__del__") | |
def __eq__(self, other): | |
del self.other | |
return False | |
a = A() | |
b = A() | |
a.__dict__[b] = 'A' | |
a.other = b | |
b.other = a | |
gc.collect() | |
del a, b | |
gc.collect() |