mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
Merge branch 'raise-textmap-parser-limits' into 'next'
Raise TEXTMAP parser limits See merge request STJr/SRB2!2473
This commit is contained in:
commit
44c4d4dabd
1 changed files with 45 additions and 15 deletions
|
@ -1554,11 +1554,41 @@ static void P_LoadThings(UINT8 *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stores positions for relevant map data spread through a TEXTMAP.
|
// Stores positions for relevant map data spread through a TEXTMAP.
|
||||||
UINT32 mapthingsPos[UINT16_MAX];
|
typedef struct textmap_block_s
|
||||||
UINT32 linesPos[UINT16_MAX];
|
{
|
||||||
UINT32 sidesPos[UINT16_MAX];
|
UINT32 *pos;
|
||||||
UINT32 vertexesPos[UINT16_MAX];
|
size_t capacity;
|
||||||
UINT32 sectorsPos[UINT16_MAX];
|
} textmap_block_t;
|
||||||
|
|
||||||
|
static textmap_block_t mapthingBlocks;
|
||||||
|
static textmap_block_t linedefBlocks;
|
||||||
|
static textmap_block_t sidedefBlocks;
|
||||||
|
static textmap_block_t vertexBlocks;
|
||||||
|
static textmap_block_t sectorBlocks;
|
||||||
|
|
||||||
|
static void TextmapStorePos(textmap_block_t *blocks, size_t *count)
|
||||||
|
{
|
||||||
|
size_t locCount = (*count) + 1;
|
||||||
|
|
||||||
|
if (blocks->pos == NULL)
|
||||||
|
{
|
||||||
|
// Initial capacity (half of the former one.)
|
||||||
|
blocks->capacity = UINT16_MAX / 2;
|
||||||
|
|
||||||
|
Z_Calloc(sizeof(blocks->pos) * blocks->capacity, PU_LEVEL, &blocks->pos);
|
||||||
|
}
|
||||||
|
else if (locCount >= blocks->capacity)
|
||||||
|
{
|
||||||
|
// If we hit the list's capacity, make space for 1024 more blocks
|
||||||
|
blocks->capacity += 1024;
|
||||||
|
|
||||||
|
Z_Realloc(blocks->pos, sizeof(blocks->pos) * blocks->capacity, PU_LEVEL, &blocks->pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
blocks->pos[locCount - 1] = M_TokenizerGetEndPos();
|
||||||
|
|
||||||
|
(*count) = locCount;
|
||||||
|
}
|
||||||
|
|
||||||
// Determine total amount of map data in TEXTMAP.
|
// Determine total amount of map data in TEXTMAP.
|
||||||
static boolean TextmapCount(size_t size)
|
static boolean TextmapCount(size_t size)
|
||||||
|
@ -1602,15 +1632,15 @@ static boolean TextmapCount(size_t size)
|
||||||
brackets++;
|
brackets++;
|
||||||
// Check for valid fields.
|
// Check for valid fields.
|
||||||
else if (fastcmp(tkn, "thing"))
|
else if (fastcmp(tkn, "thing"))
|
||||||
mapthingsPos[nummapthings++] = M_TokenizerGetEndPos();
|
TextmapStorePos(&mapthingBlocks, &nummapthings);
|
||||||
else if (fastcmp(tkn, "linedef"))
|
else if (fastcmp(tkn, "linedef"))
|
||||||
linesPos[numlines++] = M_TokenizerGetEndPos();
|
TextmapStorePos(&linedefBlocks, &numlines);
|
||||||
else if (fastcmp(tkn, "sidedef"))
|
else if (fastcmp(tkn, "sidedef"))
|
||||||
sidesPos[numsides++] = M_TokenizerGetEndPos();
|
TextmapStorePos(&sidedefBlocks, &numsides);
|
||||||
else if (fastcmp(tkn, "vertex"))
|
else if (fastcmp(tkn, "vertex"))
|
||||||
vertexesPos[numvertexes++] = M_TokenizerGetEndPos();
|
TextmapStorePos(&vertexBlocks, &numvertexes);
|
||||||
else if (fastcmp(tkn, "sector"))
|
else if (fastcmp(tkn, "sector"))
|
||||||
sectorsPos[numsectors++] = M_TokenizerGetEndPos();
|
TextmapStorePos(§orBlocks, &numsectors);
|
||||||
else
|
else
|
||||||
CONS_Alert(CONS_NOTICE, "Unknown field '%s'.\n", tkn);
|
CONS_Alert(CONS_NOTICE, "Unknown field '%s'.\n", tkn);
|
||||||
}
|
}
|
||||||
|
@ -2944,7 +2974,7 @@ static void P_LoadTextmap(void)
|
||||||
vt->floorzset = vt->ceilingzset = false;
|
vt->floorzset = vt->ceilingzset = false;
|
||||||
vt->floorz = vt->ceilingz = 0;
|
vt->floorz = vt->ceilingz = 0;
|
||||||
|
|
||||||
TextmapParse(vertexesPos[i], i, ParseTextmapVertexParameter);
|
TextmapParse(vertexBlocks.pos[i], i, ParseTextmapVertexParameter);
|
||||||
|
|
||||||
if (vt->x == INT32_MAX)
|
if (vt->x == INT32_MAX)
|
||||||
I_Error("P_LoadTextmap: vertex %s has no x value set!\n", sizeu1(i));
|
I_Error("P_LoadTextmap: vertex %s has no x value set!\n", sizeu1(i));
|
||||||
|
@ -3001,7 +3031,7 @@ static void P_LoadTextmap(void)
|
||||||
textmap_planefloor.defined = 0;
|
textmap_planefloor.defined = 0;
|
||||||
textmap_planeceiling.defined = 0;
|
textmap_planeceiling.defined = 0;
|
||||||
|
|
||||||
TextmapParse(sectorsPos[i], i, ParseTextmapSectorParameter);
|
TextmapParse(sectorBlocks.pos[i], i, ParseTextmapSectorParameter);
|
||||||
|
|
||||||
P_InitializeSector(sc);
|
P_InitializeSector(sc);
|
||||||
if (textmap_colormap.used)
|
if (textmap_colormap.used)
|
||||||
|
@ -3050,7 +3080,7 @@ static void P_LoadTextmap(void)
|
||||||
ld->sidenum[0] = NO_SIDEDEF;
|
ld->sidenum[0] = NO_SIDEDEF;
|
||||||
ld->sidenum[1] = NO_SIDEDEF;
|
ld->sidenum[1] = NO_SIDEDEF;
|
||||||
|
|
||||||
TextmapParse(linesPos[i], i, ParseTextmapLinedefParameter);
|
TextmapParse(linedefBlocks.pos[i], i, ParseTextmapLinedefParameter);
|
||||||
|
|
||||||
if (!ld->v1)
|
if (!ld->v1)
|
||||||
I_Error("P_LoadTextmap: linedef %s has no v1 value set!\n", sizeu1(i));
|
I_Error("P_LoadTextmap: linedef %s has no v1 value set!\n", sizeu1(i));
|
||||||
|
@ -3077,7 +3107,7 @@ static void P_LoadTextmap(void)
|
||||||
sd->sector = NULL;
|
sd->sector = NULL;
|
||||||
sd->repeatcnt = 0;
|
sd->repeatcnt = 0;
|
||||||
|
|
||||||
TextmapParse(sidesPos[i], i, ParseTextmapSidedefParameter);
|
TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter);
|
||||||
|
|
||||||
if (!sd->sector)
|
if (!sd->sector)
|
||||||
I_Error("P_LoadTextmap: sidedef %s has no sector value set!\n", sizeu1(i));
|
I_Error("P_LoadTextmap: sidedef %s has no sector value set!\n", sizeu1(i));
|
||||||
|
@ -3101,7 +3131,7 @@ static void P_LoadTextmap(void)
|
||||||
memset(mt->stringargs, 0x00, NUMMAPTHINGSTRINGARGS*sizeof(*mt->stringargs));
|
memset(mt->stringargs, 0x00, NUMMAPTHINGSTRINGARGS*sizeof(*mt->stringargs));
|
||||||
mt->mobj = NULL;
|
mt->mobj = NULL;
|
||||||
|
|
||||||
TextmapParse(mapthingsPos[i], i, ParseTextmapThingParameter);
|
TextmapParse(mapthingBlocks.pos[i], i, ParseTextmapThingParameter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue