From 56ae811ced87401413c4a7d8d96d2eac3c7bd880 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 26 Dec 2022 17:45:25 -0500 Subject: [PATCH] Contain end & size into savebuffer_t I would've liked to make it use a single allocate function to do this very cleanly, but these cases were very clearly not meant to be standardized and use wildly different methods to allocate & free... --- src/d_clisrv.c | 33 ++++++++++++++++++++------------- src/d_clisrv.h | 3 ++- src/d_netcmd.c | 4 +++- src/g_demo.c | 26 ++++++++++++++++---------- src/g_game.c | 23 ++++++++++++----------- src/k_profiles.c | 5 +++-- src/p_saveg.h | 8 ++++++++ src/p_setup.c | 3 +++ 8 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 360bb05b7..07c756d53 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1128,8 +1128,6 @@ static boolean SV_SendServerConfig(INT32 node) return waspacketsent; } -#define SAVEGAMESIZE (768*1024) - static boolean SV_ResendingSavegameToAnyone(void) { INT32 i; @@ -1148,7 +1146,8 @@ static void SV_SendSaveGame(INT32 node, boolean resending) UINT8 *buffertosend; // first save it in a malloced buffer - save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = NETSAVEGAMESIZE; + save.buffer = (UINT8 *)malloc(save.size); if (!save.buffer) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); @@ -1157,14 +1156,14 @@ static void SV_SendSaveGame(INT32 node, boolean resending) // Leave room for the uncompressed length. save.p = save.buffer + sizeof(UINT32); + save.end = save.buffer + save.size; P_SaveNetGame(&save, resending); length = save.p - save.buffer; - if (length > SAVEGAMESIZE) + if (length > NETSAVEGAMESIZE) { free(save.buffer); - save.p = NULL; I_Error("Savegame buffer overrun"); } @@ -1178,10 +1177,9 @@ static void SV_SendSaveGame(INT32 node, boolean resending) } // Attempt to compress it. - if((compressedlen = lzf_compress(save.buffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) + if ((compressedlen = lzf_compress(save.buffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) { // Compressing succeeded; send compressed data - free(save.buffer); // State that we're compressed. @@ -1192,7 +1190,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending) else { // Compression failed to make it smaller; send original - free(compressedsave); // State that we're not compressed @@ -1201,7 +1198,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending) } AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0); - save.p = NULL; // Remember when we started sending the savegame so we can handle timeouts sendingsavegame[node] = true; @@ -1224,20 +1220,22 @@ static void SV_SavedGame(void) sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); // first save it in a malloced buffer - save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = NETSAVEGAMESIZE; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); return; } + save.end = save.buffer + save.size; + P_SaveNetGame(&save, false); length = save.p - save.buffer; - if (length > SAVEGAMESIZE) + if (length > NETSAVEGAMESIZE) { free(save.buffer); - save.p = NULL; I_Error("Savegame buffer overrun"); } @@ -1246,7 +1244,6 @@ static void SV_SavedGame(void) CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave); free(save.buffer); - save.p = NULL; } #undef TMPSAVENAME @@ -1272,15 +1269,21 @@ static void CL_LoadReceivedSavegame(boolean reloading) } save.p = save.buffer; + save.size = length; + save.end = save.buffer + save.size; // Decompress saved game if necessary. decompressedlen = READUINT32(save.p); if(decompressedlen > 0) { UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL); + lzf_decompress(save.p, length - sizeof(UINT32), decompressedbuffer, decompressedlen); Z_Free(save.buffer); + save.p = save.buffer = decompressedbuffer; + save.size = decompressedlen; + save.end = save.buffer + decompressedlen; } paused = false; @@ -6075,6 +6078,8 @@ rewind_t *CL_SaveRewindPoint(size_t demopos) return NULL; save.buffer = save.p = rewind->savebuffer; + save.size = NETSAVEGAMESIZE; + save.end = save.buffer + save.size; P_SaveNetGame(&save, false); @@ -6102,6 +6107,8 @@ rewind_t *CL_RewindToTime(tic_t time) return NULL; save.buffer = save.p = rewindhead->savebuffer; + save.size = NETSAVEGAMESIZE; + save.end = save.buffer + save.size; P_LoadNetGame(&save, false); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e8763f681..bc534266d 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -22,6 +22,7 @@ #include "mserv.h" #include "k_pwrlv.h" // PWRLV_NUMTYPES +#include "p_saveg.h" // NETSAVEGAMESIZE /* The 'packet version' is used to distinguish packet formats. @@ -530,7 +531,7 @@ extern boolean hu_stopped; // struct rewind_t { - UINT8 savebuffer[(768*1024)]; + UINT8 savebuffer[NETSAVEGAMESIZE]; tic_t leveltime; size_t demopos; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1ab357996..2151bb70f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5794,7 +5794,9 @@ static void Command_Archivetest_f(void) ((mobj_t *)th)->mobjnum = i++; // allocate buffer - save.buffer = save.p = ZZ_Alloc(1024); + save.size = 1024; + save.buffer = save.p = ZZ_Alloc(save.size); + save.end = save.buffer + save.size; // test archive CONS_Printf("LUA_Archive...\n"); diff --git a/src/g_demo.c b/src/g_demo.c index 95353790e..579d786f5 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -72,7 +72,6 @@ tic_t demostarttime; // for comparative timing purposes static char demoname[MAX_WADPATH]; static savebuffer_t demobuf; static UINT8 *demotime_p, *demoinfo_p; -static UINT8 *demoend; static UINT8 demoflags; boolean demosynced = true; // console warning message @@ -151,7 +150,7 @@ demoghost *ghosts = NULL; #define ZT_FLAGS 0x80 // OUT OF ZIPTICS... -#define DEMOMARKER 0x80 // demoend +#define DEMOMARKER 0x80 // demobuf.end UINT8 demo_extradata[MAXPLAYERS]; UINT8 demo_writerng; // 0=no, 1=yes, 2=yes but on a timeout @@ -630,7 +629,7 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (!(demoflags & DF_GHOST) && ziptic_p > demoend - 9) + if (!(demoflags & DF_GHOST) && ziptic_p > demobuf.end - 9) { G_CheckDemoStatus(); // no more space return; @@ -703,7 +702,7 @@ void G_WriteAllGhostTics(void) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demobuf.p >= demoend - (13 + 9 + 9)) + if (demobuf.p >= demobuf.end - (13 + 9 + 9)) { G_CheckDemoStatus(); // no more space return; @@ -1995,7 +1994,7 @@ void G_WriteMetalTic(mobj_t *metal) // attention here for the ticcmd size! // latest demos with mouse aiming byte in ticcmd - if (demobuf.p >= demoend - 32) + if (demobuf.p >= demobuf.end - 32) { G_StopMetalRecording(false); // no more space return; @@ -2013,13 +2012,17 @@ void G_RecordDemo(const char *name) strcat(demoname, ".lmp"); //@TODO make a maxdemosize cvar maxsize = 1024*1024*2; + if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; + // if (demobuf.buffer) -// free(demobuf.buffer); +// P_SaveBufferFree(&demobuf); + + demobuf.size = maxsize; + demobuf.buffer = (UINT8 *)malloc(maxsize); demobuf.p = NULL; - demobuf.buffer = malloc(maxsize); - demoend = demobuf.buffer + maxsize; + demobuf.end = demobuf.buffer + demobuf.size; demo.recording = true; } @@ -2030,9 +2033,12 @@ void G_RecordMetal(void) maxsize = 1024*1024; if (M_CheckParm("-maxdemo") && M_IsNextParm()) maxsize = atoi(M_GetNextParm()) * 1024; + + demobuf.size = maxsize; + demobuf.buffer = (UINT8 *)malloc(maxsize); demobuf.p = NULL; - demobuf.buffer = malloc(maxsize); - demoend = demobuf.buffer + maxsize; + demobuf.end = demobuf.buffer + demobuf.size; + metalrecording = true; } diff --git a/src/g_game.c b/src/g_game.c index 7787d05ea..f9f1cbf95 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -72,9 +72,6 @@ UINT8 ultimatemode = false; JoyType_t Joystick[MAXSPLITSCREENPLAYERS]; -// 1024 bytes is plenty for a savegame -#define SAVEGAMESIZE (1024) - // SRB2kart char gamedatafilename[64] = #ifdef DEVELOP @@ -4531,12 +4528,14 @@ void G_SaveGameData(void) } length += nummapheaders * (MAXMAPLUMPNAME+1+4+4); - save.p = save.buffer = (UINT8 *)malloc(length); + save.size = length; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; } + save.end = save.buffer + save.size; // Version test @@ -4624,7 +4623,6 @@ void G_SaveGameData(void) FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length); free(save.buffer); - save.p = save.buffer = NULL; // Also save profiles here. PR_SaveProfiles(); @@ -4664,6 +4662,8 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) } save.p = save.buffer; + save.size = length; + save.end = save.buffer + save.size; memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); @@ -4678,7 +4678,6 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) M_StartMessage(M_GetText("Save game from different version\n\nPress ESC\n"), NULL, MM_NOTHING); Command_ExitGame_f(); Z_Free(save.buffer); - save.p = save.buffer = NULL; // no cheating! memset(&savedata, 0, sizeof(savedata)); @@ -4714,7 +4713,6 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) // done Z_Free(save.buffer); - save.p = save.buffer = NULL; // gameaction = ga_nothing; // G_SetGamestate(GS_LEVEL); @@ -4753,12 +4751,14 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) char name[VERSIONSIZE]; size_t length; - save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); + save.size = SAVEGAMESIZE; + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; } + save.end = save.buffer + save.size; memset(name, 0, sizeof (name)); sprintf(name, (marathonmode ? "back-up %d" : "version %d"), VERSION); @@ -4777,7 +4777,6 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) length = save.p - save.buffer; saved = FIL_WriteFile(backup, save.buffer, length); free(save.buffer); - save.p = save.buffer = NULL; } gameaction = ga_nothing; @@ -4789,7 +4788,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) } #define BADSAVE goto cleanup; -#define CHECKPOS if (save.p >= end_p) BADSAVE +#define CHECKPOS if (save.p >= save.end) BADSAVE void G_SaveGameOver(UINT32 slot, boolean modifylives) { boolean saved = false; @@ -4814,11 +4813,13 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) { char temp[sizeof(timeattackfolder)]; - UINT8 *end_p = save.buffer + length; UINT8 *lives_p; SINT8 pllives; save.p = save.buffer; + save.size = length; + save.end = save.buffer + save.size; + // Version check memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); diff --git a/src/k_profiles.c b/src/k_profiles.c index f24d623ab..1163b1f8d 100644 --- a/src/k_profiles.c +++ b/src/k_profiles.c @@ -219,12 +219,14 @@ void PR_SaveProfiles(void) UINT8 i, j, k; savebuffer_t save; - save.p = save.buffer = (UINT8 *)malloc(sizeof(UINT32) + (numprofiles * sizeof(profile_t))); + save.size = sizeof(UINT32) + (numprofiles * sizeof(profile_t)); + save.p = save.buffer = (UINT8 *)malloc(save.size); if (!save.p) { I_Error("No more free memory for saving profiles\n"); return; } + save.end = save.buffer + save.size; // Add header. WRITESTRINGN(save.p, PROFILEHEADER, headerlen); @@ -272,7 +274,6 @@ void PR_SaveProfiles(void) I_Error("Couldn't save profiles. Are you out of Disk space / playing in a protected folder?"); } free(save.buffer); - save.p = save.buffer = NULL; } void PR_LoadProfiles(void) diff --git a/src/p_saveg.h b/src/p_saveg.h index 18e343509..a658d63c9 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -18,6 +18,12 @@ #pragma interface #endif +// 1024 bytes is plenty for a savegame +#define SAVEGAMESIZE (1024) + +// For netgames +#define NETSAVEGAMESIZE (768*1024) + // Persistent storage/archiving. // These are the load / save game routines. @@ -43,6 +49,8 @@ struct savebuffer_t { UINT8 *buffer; UINT8 *p; + UINT8 *end; + size_t size; }; #endif diff --git a/src/p_setup.c b/src/p_setup.c index b32c5126c..e2e11a613 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -725,6 +725,7 @@ void P_WriteThings(void) savebuffer_t save; INT16 temp; + save.size = nummapthings * sizeof (mapthing_t); save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t)); if (!save.p) @@ -733,6 +734,8 @@ void P_WriteThings(void) return; } + save.end = save.buffer + save.size; + mt = mapthings; for (i = 0; i < nummapthings; i++, mt++) {