| """ |
| 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() |