mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-02-08 16:52:10 +00:00
maps: prevalidate lumps on load
This commit is contained in:
parent
d87b1b512d
commit
d58e1493e3
3 changed files with 105 additions and 1 deletions
|
@ -144,3 +144,94 @@ Mod_LoadPlanes(const char *name, cplane_t **planes, int *numplanes,
|
||||||
out->signbits = bits;
|
out->signbits = bits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const size_t idbsplumps[HEADER_LUMPS] = {
|
||||||
|
sizeof(char), // LUMP_ENTITIES
|
||||||
|
sizeof(dplane_t), // LUMP_PLANES
|
||||||
|
sizeof(dvertex_t), // LUMP_VERTEXES
|
||||||
|
sizeof(char), // LUMP_VISIBILITY
|
||||||
|
sizeof(dnode_t), // LUMP_NODES
|
||||||
|
sizeof(texinfo_t), // LUMP_TEXINFO
|
||||||
|
sizeof(dface_t), // LUMP_FACES
|
||||||
|
sizeof(char), // LUMP_LIGHTING
|
||||||
|
sizeof(dleaf_t), // LUMP_LEAFS
|
||||||
|
sizeof(short), // LUMP_LEAFFACES
|
||||||
|
sizeof(short), // LUMP_LEAFBRUSHES
|
||||||
|
sizeof(dedge_t), // LUMP_EDGES
|
||||||
|
sizeof(int), // LUMP_SURFEDGES
|
||||||
|
sizeof(dmodel_t), // LUMP_MODELS
|
||||||
|
sizeof(dbrush_t), // LUMP_BRUSHES
|
||||||
|
sizeof(dbrushside_t), // LUMP_BRUSHSIDES
|
||||||
|
0, // LUMP_POP
|
||||||
|
sizeof(darea_t), // LUMP_AREAS
|
||||||
|
sizeof(dareaportal_t), // LUMP_AREAPORTALS
|
||||||
|
};
|
||||||
|
|
||||||
|
static const size_t qbsplumps[HEADER_LUMPS] = {
|
||||||
|
sizeof(char), // LUMP_ENTITIES
|
||||||
|
sizeof(dplane_t), // LUMP_PLANES
|
||||||
|
sizeof(dvertex_t), // LUMP_VERTEXES
|
||||||
|
sizeof(char), // LUMP_VISIBILITY
|
||||||
|
sizeof(dqnode_t), // LUMP_NODES
|
||||||
|
sizeof(texinfo_t), // LUMP_TEXINFO
|
||||||
|
sizeof(dqface_t), // LUMP_FACES
|
||||||
|
sizeof(char), // LUMP_LIGHTING
|
||||||
|
sizeof(dqleaf_t), // LUMP_LEAFS
|
||||||
|
sizeof(int), // LUMP_LEAFFACES
|
||||||
|
sizeof(int), // LUMP_LEAFBRUSHES
|
||||||
|
sizeof(dqedge_t), // LUMP_EDGES
|
||||||
|
sizeof(int), // LUMP_SURFEDGES
|
||||||
|
sizeof(dmodel_t), // LUMP_MODELS
|
||||||
|
sizeof(dbrush_t), // LUMP_BRUSHES
|
||||||
|
sizeof(dqbrushside_t), // LUMP_BRUSHSIDES
|
||||||
|
0, // LUMP_POP
|
||||||
|
sizeof(darea_t), // LUMP_AREAS
|
||||||
|
sizeof(dareaportal_t), // LUMP_AREAPORTALS
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
Mod_LoadValidateLumps(const char *name, const dheader_t *header)
|
||||||
|
{
|
||||||
|
const size_t *rules = NULL;
|
||||||
|
qboolean error = false;
|
||||||
|
int s;
|
||||||
|
|
||||||
|
if (header->ident == IDBSPHEADER)
|
||||||
|
{
|
||||||
|
rules = idbsplumps;
|
||||||
|
}
|
||||||
|
else if (header->ident == QBSPHEADER)
|
||||||
|
{
|
||||||
|
rules = qbsplumps;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (s = 0; s < HEADER_LUMPS; s++)
|
||||||
|
{
|
||||||
|
if (rules[s])
|
||||||
|
{
|
||||||
|
if (header->lumps[s].filelen % rules[s])
|
||||||
|
{
|
||||||
|
Com_Printf("%s: lump #%d: incorrect size %d / %zd\n",
|
||||||
|
__func__, s, header->lumps[s].filelen, rules[s]);
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Com_Printf("%s: lump #%d: correct size %d / %zd\n",
|
||||||
|
__func__, s, header->lumps[s].filelen, rules[s]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
Com_Error(ERR_DROP, "%s: Map %s has incorrect lumps",
|
||||||
|
__func__, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1955,7 +1955,17 @@ CM_LoadCachedMap(const char *name, model_t *mod)
|
||||||
__func__, name, header.ident, IDBSPHEADER);
|
__func__, name, header.ident, IDBSPHEADER);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.version != BSPVERSION && header.version != BSPDKMVERSION)
|
if ((header.ident == IDBSPHEADER) &&
|
||||||
|
(header.version != BSPVERSION) &&
|
||||||
|
(header.version != BSPDKMVERSION))
|
||||||
|
{
|
||||||
|
Com_Error(ERR_DROP,
|
||||||
|
"%s: %s has wrong version number (%i should be %i)",
|
||||||
|
__func__, name, header.version, BSPVERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((header.ident == QBSPHEADER) &&
|
||||||
|
(header.version != BSPVERSION))
|
||||||
{
|
{
|
||||||
Com_Error(ERR_DROP,
|
Com_Error(ERR_DROP,
|
||||||
"%s: %s has wrong version number (%i should be %i)",
|
"%s: %s has wrong version number (%i should be %i)",
|
||||||
|
@ -1970,6 +1980,8 @@ CM_LoadCachedMap(const char *name, model_t *mod)
|
||||||
(header.ident >> 24) & 0xFF,
|
(header.ident >> 24) & 0xFF,
|
||||||
header.version);
|
header.version);
|
||||||
|
|
||||||
|
Mod_LoadValidateLumps(name, &header);
|
||||||
|
|
||||||
cmod_base = (byte *)buf;
|
cmod_base = (byte *)buf;
|
||||||
|
|
||||||
/* load into heap */
|
/* load into heap */
|
||||||
|
|
|
@ -44,5 +44,6 @@ extern void Mod_LoadVisibility(const char *name, dvis_t **vis, int *numvisibilit
|
||||||
const byte *mod_base, const lump_t *l);
|
const byte *mod_base, const lump_t *l);
|
||||||
extern void Mod_LoadPlanes(const char *name, cplane_t **planes, int *numplanes,
|
extern void Mod_LoadPlanes(const char *name, cplane_t **planes, int *numplanes,
|
||||||
const byte *mod_base, const lump_t *l);
|
const byte *mod_base, const lump_t *l);
|
||||||
|
extern void Mod_LoadValidateLumps(const char *name, const dheader_t *header);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue