- don't assume that deserializing an actor will result in a valid pointer.

This addresses a very strange crash I encounteded while travelling in a hub, and ended up with a NULL pointer after the 'Serialize' call which means that some code cleared the variable that is currently being deserialized. I was completely unable to find out what caused this because there is so much recursion going on in the deserializer. All actions on the deserialized actor are now being done with a local copy of that variable so that altering the actual one won't have any adverse effects.
This commit is contained in:
Christoph Oelckers 2016-08-25 21:15:53 +02:00
parent e22043a25b
commit 48430d9b1a

View file

@ -1194,6 +1194,7 @@ FArchive &FArchive::ReadObject (DObject* &obj, PClass *wanttype)
const PClass *type; const PClass *type;
BYTE playerNum; BYTE playerNum;
DWORD index; DWORD index;
DObject *newobj;
operator<< (objHead); operator<< (objHead);
@ -1255,11 +1256,11 @@ FArchive &FArchive::ReadObject (DObject* &obj, PClass *wanttype)
case NEW_CLS_OBJ: case NEW_CLS_OBJ:
type = ReadClass (wanttype); type = ReadClass (wanttype);
// Printf ("New class: %s (%u)\n", type->Name, m_File->Tell()); // Printf ("New class: %s (%u)\n", type->Name, m_File->Tell());
obj = type->CreateNew (); newobj = obj = type->CreateNew ();
MapObject (obj); MapObject (obj);
obj->SerializeUserVars (*this); newobj->SerializeUserVars (*this);
obj->Serialize (*this); newobj->Serialize (*this);
obj->CheckIfSerialized (); newobj->CheckIfSerialized ();
break; break;
case NEW_PLYR_OBJ: case NEW_PLYR_OBJ: