Fix crash when attached object no longer exists
authorRogier <rogier777@gmail.com>
Sun, 6 Nov 2016 15:18:29 +0000 (16:18 +0100)
committerNer'zhul <nerzhul@users.noreply.github.com>
Sun, 13 Nov 2016 09:10:28 +0000 (10:10 +0100)
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...

src/script/lua_api/l_object.cpp

index 42395717f38cfdff3870ba68729e35a84810eec7..2a8b8a64eec67e2719f111cdb2bec606319fb76f 100644 (file)
@@ -140,8 +140,9 @@ int ObjectRef::l_remove(lua_State *L)
        UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
        UNORDERED_SET<int>::iterator it;
        for (it = child_ids.begin(); it != child_ids.end(); ++it) {
-               ServerActiveObject *child = env->getActiveObject(*it);
-               child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
+               // Child can be NULL if it was deleted earlier
+               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;