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...
This commit is contained in:
Rogier 2016-11-06 16:18:29 +01:00 committed by Ner'zhul
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;