Commit 4ebbe013 authored by Stefan Behnel's avatar Stefan Behnel

fix strict aliasing issues for type importing code in __Pyx_GetVtable()

parent 2acc8dee
...@@ -2051,12 +2051,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -2051,12 +2051,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.error_goto_if_null(type.typeptr_cname, pos)) code.error_goto_if_null(type.typeptr_cname, pos))
self.use_type_import_utility_code(env) self.use_type_import_utility_code(env)
if type.vtabptr_cname: if type.vtabptr_cname:
code.putln(
"if (__Pyx_GetVtable(%s->tp_dict, &%s) < 0) %s" % (
type.typeptr_cname,
type.vtabptr_cname,
code.error_goto(pos)))
env.use_utility_code(Nodes.get_vtable_utility_code) env.use_utility_code(Nodes.get_vtable_utility_code)
code.putln("%s = (struct %s*)__Pyx_GetVtable(%s->tp_dict); %s" % (
type.vtabptr_cname,
type.vtabstruct_cname,
type.typeptr_cname,
code.error_goto_if_null(type.vtabptr_cname, pos)))
env.types_imported[type] = 1 env.types_imported[type] = 1
py3_type_name_map = {'str' : 'bytes', 'unicode' : 'str'} py3_type_name_map = {'str' : 'bytes', 'unicode' : 'str'}
......
...@@ -6244,25 +6244,26 @@ bad: ...@@ -6244,25 +6244,26 @@ bad:
get_vtable_utility_code = UtilityCode( get_vtable_utility_code = UtilityCode(
proto = """ proto = """
static int __Pyx_GetVtable(PyObject *dict, void *vtabptr); /*proto*/ static void* __Pyx_GetVtable(PyObject *dict); /*proto*/
""", """,
impl = r""" impl = r"""
static int __Pyx_GetVtable(PyObject *dict, void *vtabptr) { static void* __Pyx_GetVtable(PyObject *dict) {
void* ptr;
PyObject *ob = PyMapping_GetItemString(dict, (char *)"__pyx_vtable__"); PyObject *ob = PyMapping_GetItemString(dict, (char *)"__pyx_vtable__");
if (!ob) if (!ob)
goto bad; goto bad;
#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
*(void **)vtabptr = PyCapsule_GetPointer(ob, 0); ptr = PyCapsule_GetPointer(ob, 0);
#else #else
*(void **)vtabptr = PyCObject_AsVoidPtr(ob); ptr = PyCObject_AsVoidPtr(ob);
#endif #endif
if (!*(void **)vtabptr) if (!ptr && !PyErr_Occurred())
goto bad; PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type");
Py_DECREF(ob); Py_DECREF(ob);
return 0; return ptr;
bad: bad:
Py_XDECREF(ob); Py_XDECREF(ob);
return -1; return NULL;
} }
""") """)
......
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