Throw an exception when attempting to load an incompatible holder

Instead of a segfault. Fixes #751.

This covers the case of loading a custom holder from a default-holder
instance. Attempting to load one custom holder from a different custom
holder (i.e. not `std::unique_ptr`) yields undefined behavior, just as
#588 established for inheritance.
This commit is contained in:
Dean Moldovan
2017-03-20 21:53:24 +01:00
parent 0f5ec0a87e
commit cd3d1fc7df
3 changed files with 18 additions and 0 deletions

View File

@@ -919,6 +919,9 @@ public:
return true;
}
if (typeinfo->default_holder)
throw cast_error("Unable to load a custom holder type from a default-holder instance");
if (typeinfo->simple_type) { /* Case 1: no multiple inheritance etc. involved */
/* Check if we can safely perform a reinterpret-style cast */
if (PyType_IsSubtype(tobj, typeinfo->type))