Fix savegame taglist resizing

Fixes a crash when loading savegames because the save game code wasn't
expecting to need to use the LevelPool functions.
This commit is contained in:
Eidolon 2024-11-09 18:16:08 -06:00
parent b711c82237
commit 411cb468ae
3 changed files with 28 additions and 16 deletions

View file

@ -2478,8 +2478,8 @@ static void UnArchiveSectors(savebuffer_t *save)
// Reallocate if size differs. // Reallocate if size differs.
if (ncount != sectors[i].tags.count) if (ncount != sectors[i].tags.count)
{ {
sectors[i].tags.tags = (mtag_t*)Z_LevelPoolRealloc(sectors[i].tags.tags, sectors[i].tags.count * sizeof(mtag_t), ncount*sizeof(mtag_t));
sectors[i].tags.count = ncount; sectors[i].tags.count = ncount;
sectors[i].tags.tags = (mtag_t*)Z_Realloc(sectors[i].tags.tags, ncount*sizeof(mtag_t), PU_LEVEL, NULL);
} }
for (j = 0; j < ncount; j++) for (j = 0; j < ncount; j++)
@ -2741,8 +2741,8 @@ static void UnArchiveLines(savebuffer_t *save)
// Reallocate if size differs. // Reallocate if size differs.
if (ncount != lines[i].tags.count) if (ncount != lines[i].tags.count)
{ {
lines[i].tags.tags = (mtag_t*)Z_LevelPoolRealloc(lines[i].tags.tags, lines[i].tags.count * sizeof(mtag_t), ncount*sizeof(mtag_t));
lines[i].tags.count = ncount; lines[i].tags.count = ncount;
lines[i].tags.tags = (mtag_t*)Z_Realloc(lines[i].tags.tags, ncount*sizeof(mtag_t), PU_LEVEL, NULL);
} }
for (j = 0; j < ncount; j++) for (j = 0; j < ncount; j++)
@ -6949,25 +6949,23 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading)
{ {
if (spawnss->tags.count) if (spawnss->tags.count)
{ {
ss->tags.count = spawnss->tags.count;
ss->tags.tags = static_cast<mtag_t *>( ss->tags.tags = static_cast<mtag_t *>(
memcpy( memcpy(
Z_Realloc( Z_LevelPoolRealloc(
ss->tags.tags, ss->tags.tags,
spawnss->tags.count * sizeof(mtag_t), ss->tags.count * sizeof(mtag_t),
PU_LEVEL, spawnss->tags.count * sizeof(mtag_t)
nullptr
), ),
spawnss->tags.tags, spawnss->tags.tags,
spawnss->tags.count * sizeof(mtag_t) spawnss->tags.count * sizeof(mtag_t)
) )
); );
ss->tags.count = spawnss->tags.count;
} }
else else
{ {
Z_LevelPoolFree(ss->tags.tags, ss->tags.count * sizeof(mtag_t));
ss->tags.count = 0; ss->tags.count = 0;
Z_Free(ss->tags.tags);
} }
} }
@ -7039,25 +7037,23 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading)
{ {
if (spawnli->tags.count) if (spawnli->tags.count)
{ {
li->tags.count = spawnli->tags.count;
li->tags.tags = static_cast<mtag_t *>( li->tags.tags = static_cast<mtag_t *>(
memcpy( memcpy(
Z_Realloc( Z_LevelPoolRealloc(
li->tags.tags, li->tags.tags,
spawnli->tags.count * sizeof(mtag_t), li->tags.count * sizeof(mtag_t),
PU_LEVEL, spawnli->tags.count * sizeof(mtag_t)
nullptr
), ),
spawnli->tags.tags, spawnli->tags.tags,
spawnli->tags.count * sizeof(mtag_t) spawnli->tags.count * sizeof(mtag_t)
) )
); );
li->tags.count = spawnli->tags.count;
} }
else else
{ {
Z_LevelPoolFree(li->tags.tags, li->tags.count * sizeof(mtag_t));
li->tags.count = 0; li->tags.count = 0;
Z_Free(li->tags.tags);
} }
} }

View file

@ -740,3 +740,18 @@ void Z_LevelPoolFree(void* p, size_t size)
} }
return Z_Free(p); return Z_Free(p);
} }
void* Z_LevelPoolRealloc(void* ptr, size_t orig_size, size_t size)
{
void* newptr = nullptr;
if (size > 0)
{
newptr = Z_LevelPoolCalloc(size);
}
if (orig_size > 0)
{
memcpy(newptr, ptr, orig_size);
Z_LevelPoolFree(ptr, orig_size);
}
return newptr;
}

View file

@ -154,6 +154,7 @@ char *Z_StrDup(const char *in);
void *Z_LevelPoolMalloc(size_t size); void *Z_LevelPoolMalloc(size_t size);
void *Z_LevelPoolCalloc(size_t size); void *Z_LevelPoolCalloc(size_t size);
void Z_LevelPoolFree(void *p, size_t size); void Z_LevelPoolFree(void *p, size_t size);
void *Z_LevelPoolRealloc(void *p, size_t orig_size, size_t size);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"