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.
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.tags = (mtag_t*)Z_Realloc(sectors[i].tags.tags, ncount*sizeof(mtag_t), PU_LEVEL, NULL);
}
for (j = 0; j < ncount; j++)
@ -2741,8 +2741,8 @@ static void UnArchiveLines(savebuffer_t *save)
// Reallocate if size differs.
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.tags = (mtag_t*)Z_Realloc(lines[i].tags.tags, ncount*sizeof(mtag_t), PU_LEVEL, NULL);
}
for (j = 0; j < ncount; j++)
@ -6949,25 +6949,23 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading)
{
if (spawnss->tags.count)
{
ss->tags.count = spawnss->tags.count;
ss->tags.tags = static_cast<mtag_t *>(
memcpy(
Z_Realloc(
Z_LevelPoolRealloc(
ss->tags.tags,
spawnss->tags.count * sizeof(mtag_t),
PU_LEVEL,
nullptr
ss->tags.count * sizeof(mtag_t),
spawnss->tags.count * sizeof(mtag_t)
),
spawnss->tags.tags,
spawnss->tags.count * sizeof(mtag_t)
)
);
ss->tags.count = spawnss->tags.count;
}
else
{
Z_LevelPoolFree(ss->tags.tags, ss->tags.count * sizeof(mtag_t));
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)
{
li->tags.count = spawnli->tags.count;
li->tags.tags = static_cast<mtag_t *>(
memcpy(
Z_Realloc(
Z_LevelPoolRealloc(
li->tags.tags,
spawnli->tags.count * sizeof(mtag_t),
PU_LEVEL,
nullptr
li->tags.count * sizeof(mtag_t),
spawnli->tags.count * sizeof(mtag_t)
),
spawnli->tags.tags,
spawnli->tags.count * sizeof(mtag_t)
)
);
li->tags.count = spawnli->tags.count;
}
else
{
Z_LevelPoolFree(li->tags.tags, li->tags.count * sizeof(mtag_t));
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);
}
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_LevelPoolCalloc(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
} // extern "C"