mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-25 06:35:12 +00:00
Fix invalid access when reinterpret_casting a non-pybind11 PyObject* to instance* (found by Valgrind in #2746) (#2755)
This commit is contained in:
parent
2110d2d8ba
commit
e612043d43
@ -504,15 +504,15 @@ protected:
|
||||
|
||||
auto self_value_and_holder = value_and_holder();
|
||||
if (overloads->is_constructor) {
|
||||
const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
|
||||
const auto pi = reinterpret_cast<instance *>(parent.ptr());
|
||||
self_value_and_holder = pi->get_value_and_holder(tinfo, false);
|
||||
|
||||
if (!self_value_and_holder.type || !self_value_and_holder.inst) {
|
||||
if (!PyObject_TypeCheck(parent.ptr(), (PyTypeObject *) overloads->scope.ptr())) {
|
||||
PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
|
||||
const auto pi = reinterpret_cast<instance *>(parent.ptr());
|
||||
self_value_and_holder = pi->get_value_and_holder(tinfo, true);
|
||||
|
||||
// If this value is already registered it must mean __init__ is invoked multiple times;
|
||||
// we really can't support that in C++, so just ignore the second __init__.
|
||||
if (self_value_and_holder.instance_registered())
|
||||
|
Loading…
Reference in New Issue
Block a user