--- /dev/null
+"""
+General example for an attack against code like this:
+
+ Py_DECREF(obj->attr); obj->attr = ...;
+
+here in Module/_json.c:scanner_init().
+
+Explanation: if the first Py_DECREF() calls either a __del__ or a
+weakref callback, it will run while the 'obj' appears to have in
+'obj->attr' still the old reference to the object, but not holding
+the reference count any more.
+
+Status: progress has been made replacing these cases, but there is an
+infinite number of such cases.
+"""
+
+import _json, weakref
+
+class Ctx1(object):
+ encoding = "utf8"
+ strict = None
+ object_hook = None
+ object_pairs_hook = None
+ parse_float = None
+ parse_int = None
+ parse_constant = None
+
+class Foo(unicode):
+ pass
+
+def delete_me(*args):
+ print scanner.encoding.__dict__
+
+class Ctx2(Ctx1):
+ @property
+ def encoding(self):
+ global wref
+ f = Foo("utf8")
+ f.abc = globals()
+ wref = weakref.ref(f, delete_me)
+ return f
+
+scanner = _json.make_scanner(Ctx1())
+scanner.__init__(Ctx2())