Loadgame_f() may go past sv.num_edicts, but it does not go through

ED_Alloc(), therefore such ents will have uninitialized members.
This used to lead to bad crashes with e.g. Rubicon Rumble Pack maps
since svn r1286 when we began allocating sv.edicts using malloc and
only zero-filling when necessary.  So, check against sv.num_edicts
and zero-fill the ent properly when necessary.

git-svn-id: svn+ssh://svn.code.sf.net/p/quakespasm/code/trunk@1318 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
sezero 2016-06-24 16:04:25 +00:00
parent 2c6697641c
commit 2f4eac979e

View file

@ -1225,9 +1225,16 @@ void Host_Loadgame_f (void)
}
else
{ // parse an edict
ent = EDICT_NUM(entnum);
if (entnum < sv.num_edicts) {
memset (&ent->v, 0, progs->entityfields * 4);
}
else if (entnum < sv.max_edicts) {
memset (ent, 0, pr_edict_size);
}
else {
Host_Error ("Loadgame: no free edicts (max_edicts is %i)", sv.max_edicts);
}
ent->free = false;
ED_ParseEdict (start, ent);