-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Closed
Labels
Milestone
Description
After some debugging, we found out that __Pyx_PyType_Ready can garble arbitrary memory.
Indeed, it has the following lines:
#if PY_VERSION_HEX >= 0x03050000
t->tp_flags |= Py_TPFLAGS_HEAPTYPE;
#endif
r = PyType_Ready(t);
#if PY_VERSION_HEX >= 0x03050000
t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE;
#endifThe problem is if PyType_Ready indirectly triggers the garbage collector. The static type t will be incorrectly considered as a heap type, and therefore as a GC-enabled object. When traversing this object, the GC will lookup the GC header by subtracting 16 bytes from t's beginning, which may point to any other C static variable. Then it will temporarily "decref" the GC header, modifying other data.
(in our case, that other data is a Cython function's ml_flags, rendering it unusable, but that might be something else, depending what your Cython module contains)