37 lines
724 B
Python
37 lines
724 B
Python
|
"""
|
||
|
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()
|