Commit 7e27c7cd authored by Stefan Behnel's avatar Stefan Behnel

Implement safe-guard to prevent loading Cython modules into multiple subinterpreters.

parent 7562f7c2
...@@ -906,6 +906,31 @@ PyEval_InitThreads(); ...@@ -906,6 +906,31 @@ PyEval_InitThreads();
//@substitute: naming //@substitute: naming
//#if CYTHON_PEP489_MULTI_PHASE_INIT //#if CYTHON_PEP489_MULTI_PHASE_INIT
static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
#if PY_VERSION_HEX >= 0x030700A1
static PY_INT64_T main_interpreter_id = -1;
PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
if (main_interpreter_id == -1) {
main_interpreter_id = current_id;
return (unlikely(current_id == -1)) ? -1 : 0;
} else if (unlikely(main_interpreter_id != current_id))
#else
static PyInterpreterState *main_interpreter = NULL;
PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
if (!main_interpreter) {
main_interpreter = current_interpreter;
} else if (unlikely(main_interpreter != current_interpreter))
#endif
{
PyErr_SetString(
PyExc_RuntimeError, "Interpreter change detected - this module does not support subinterpreters.");
return -1;
}
return 0;
}
static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) {
PyObject *value = PyObject_GetAttrString(spec, from_name); PyObject *value = PyObject_GetAttrString(spec, from_name);
int result = 0; int result = 0;
...@@ -924,6 +949,8 @@ static CYTHON_SMALL_CODE PyObject* ${pymodule_create_func_cname}(PyObject *spec, ...@@ -924,6 +949,8 @@ static CYTHON_SMALL_CODE PyObject* ${pymodule_create_func_cname}(PyObject *spec,
PyObject *module = NULL, *moddict, *modname; PyObject *module = NULL, *moddict, *modname;
// For now, we only have exactly one module instance. // For now, we only have exactly one module instance.
if (__Pyx_check_single_interpreter())
return NULL;
if (${module_cname}) if (${module_cname})
return __Pyx_NewRef(${module_cname}); return __Pyx_NewRef(${module_cname});
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment