From 411cb468aee961e3923f9360cdf691660da0beaf Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 9 Nov 2024 18:16:08 -0600 Subject: [PATCH] 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. --- src/p_saveg.cpp | 28 ++++++++++++---------------- src/z_zone.cpp | 15 +++++++++++++++ src/z_zone.h | 1 + 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 11a7bf06b..ecf0d16b0 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -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( 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( 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); } } diff --git a/src/z_zone.cpp b/src/z_zone.cpp index 1d80b8fc6..9a05d4899 100644 --- a/src/z_zone.cpp +++ b/src/z_zone.cpp @@ -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; +} diff --git a/src/z_zone.h b/src/z_zone.h index 0e544134f..48e4fdcda 100644 --- a/src/z_zone.h +++ b/src/z_zone.h @@ -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"