diff --git a/src/java/com/threerings/presents/dobj/DObject.java b/src/java/com/threerings/presents/dobj/DObject.java index a2164047c..e793b388e 100644 --- a/src/java/com/threerings/presents/dobj/DObject.java +++ b/src/java/com/threerings/presents/dobj/DObject.java @@ -367,6 +367,10 @@ public class DObject */ public void destroy () { + if (_oid == 0) { + log.warning("Denying request to destroy an uninitialized object!", new Exception()); + return; + } postEvent(new ObjectDestroyedEvent(_oid)); } diff --git a/src/java/com/threerings/presents/server/PresentsDObjectMgr.java b/src/java/com/threerings/presents/server/PresentsDObjectMgr.java index ddb01e87a..8c657a1fc 100644 --- a/src/java/com/threerings/presents/server/PresentsDObjectMgr.java +++ b/src/java/com/threerings/presents/server/PresentsDObjectMgr.java @@ -96,9 +96,9 @@ public class PresentsDObjectMgr { // create a dummy object to live as oid zero and use that for some internal event trickery DObject dummy = new DObject(); - dummy.setOid(0); + dummy.setOid(DUMMY_OID); dummy.setManager(this); - _objects.put(0, new DObject()); + _objects.put(DUMMY_OID, new DObject()); // register a couple of reports with the report manager repmgr.registerReporter(ReportManager.DEFAULT_TYPE, new ReportManager.Reporter() { @@ -268,6 +268,10 @@ public class PresentsDObjectMgr // from interface RootDObjectManager public void destroyObject (int oid) { + if (oid == DUMMY_OID) { + log.warning("Denying request to destroy the dummy object!", new Exception()); + return; + } // queue up an object destroyed event postEvent(new ObjectDestroyedEvent(oid)); } @@ -412,6 +416,11 @@ public class PresentsDObjectMgr { int oid = target.getOid(); + if (oid == DUMMY_OID) { + log.warning("Denying attempt to destroy dummy object!", new Exception()); + return false; + } + // log.info("Removing destroyed object from table", "oid", oid); // remove the object from the table @@ -871,7 +880,7 @@ public class PresentsDObjectMgr public AccessObjectEvent (int oid, Subscriber target, int action) { - super(0); // target the bogus object + super(DUMMY_OID); // target the bogus object _oid = oid; _target = target; _action = action; @@ -1067,4 +1076,10 @@ public class PresentsDObjectMgr /** The default size of an oid list refs vector. */ protected static final int DEFREFVEC_SIZE = 4; + + /** + * The oid of the DOject created during object manager startup that isn't actually + * distributed. + */ + protected static final int DUMMY_OID = 0; } diff --git a/src/java/com/threerings/presents/server/PresentsSession.java b/src/java/com/threerings/presents/server/PresentsSession.java index 2d40301f4..13da993b7 100644 --- a/src/java/com/threerings/presents/server/PresentsSession.java +++ b/src/java/com/threerings/presents/server/PresentsSession.java @@ -962,7 +962,7 @@ public class PresentsSession // from interface ProxySubscriber public void eventReceived (DEvent event) { - if (event instanceof PresentsDObjectMgr.AccessObjectEvent) { + if (event instanceof PresentsDObjectMgr.AccessObjectEvent) { log.warning("Ignoring event that shouldn't be forwarded " + event + ".", new Exception()); return;