Fix crash when attached object no longer exists
Active objects that are attached to other objects are not safe from deletion. As a result, the parent object may have a reference to an id of a child's that no longer exists. If at some point an attempt is made to manipulate the child, enviromment->getActiveObject(child-id) returns NULL. Using the NULL pointer causes the crash...master
parent
e4031156f1
commit
1980d9ea31
|
@ -140,8 +140,9 @@ int ObjectRef::l_remove(lua_State *L)
|
||||||
UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
|
UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
|
||||||
UNORDERED_SET<int>::iterator it;
|
UNORDERED_SET<int>::iterator it;
|
||||||
for (it = child_ids.begin(); it != child_ids.end(); ++it) {
|
for (it = child_ids.begin(); it != child_ids.end(); ++it) {
|
||||||
ServerActiveObject *child = env->getActiveObject(*it);
|
// Child can be NULL if it was deleted earlier
|
||||||
child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
|
if (ServerActiveObject *child = env->getActiveObject(*it))
|
||||||
|
child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
|
verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
|
||||||
|
|
Loading…
Reference in New Issue