Commit b5e77068 authored by Stefan Behnel's avatar Stefan Behnel

add some safety checks to the shared common types import

parent 0766f97f
......@@ -14,7 +14,20 @@ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
Py_INCREF(fake_module);
cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
if (!cached_type) {
if (cached_type) {
if (!PyType_Check((PyObject*)cached_type)) {
PyErr_Format(PyExc_TypeError,
"Shared Cython type %.200s is not a type object",
type->tp_name);
goto bad;
}
if (cached_type->tp_basicsize != type->tp_basicsize) {
PyErr_Format(PyExc_TypeError,
"Shared Cython type %.200s has the wrong size, try recompiling",
type->tp_name);
goto bad;
}
} else {
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
PyErr_Clear();
if (PyType_Ready(type) < 0) goto bad;
......@@ -24,8 +37,13 @@ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
cached_type = type;
}
bad:
done:
Py_DECREF(fake_module);
// NOTE: always returns owned reference, or NULL on error
return cached_type;
bad:
Py_XDECREF(cached_type);
cached_type = NULL;
goto done;
}
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