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...
This commit is contained in:
Sally Coolatta 2022-12-26 17:45:25 -05:00
parent d4beb91e18
commit 56ae811ced
8 changed files with 67 additions and 38 deletions

View file

@ -1128,8 +1128,6 @@ static boolean SV_SendServerConfig(INT32 node)
return waspacketsent; return waspacketsent;
} }
#define SAVEGAMESIZE (768*1024)
static boolean SV_ResendingSavegameToAnyone(void) static boolean SV_ResendingSavegameToAnyone(void)
{ {
INT32 i; INT32 i;
@ -1148,7 +1146,8 @@ static void SV_SendSaveGame(INT32 node, boolean resending)
UINT8 *buffertosend; UINT8 *buffertosend;
// first save it in a malloced buffer // first save it in a malloced buffer
save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); save.size = NETSAVEGAMESIZE;
save.buffer = (UINT8 *)malloc(save.size);
if (!save.buffer) if (!save.buffer)
{ {
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); 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. // Leave room for the uncompressed length.
save.p = save.buffer + sizeof(UINT32); save.p = save.buffer + sizeof(UINT32);
save.end = save.buffer + save.size;
P_SaveNetGame(&save, resending); P_SaveNetGame(&save, resending);
length = save.p - save.buffer; length = save.p - save.buffer;
if (length > SAVEGAMESIZE) if (length > NETSAVEGAMESIZE)
{ {
free(save.buffer); free(save.buffer);
save.p = NULL;
I_Error("Savegame buffer overrun"); I_Error("Savegame buffer overrun");
} }
@ -1178,10 +1177,9 @@ static void SV_SendSaveGame(INT32 node, boolean resending)
} }
// Attempt to compress it. // 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 // Compressing succeeded; send compressed data
free(save.buffer); free(save.buffer);
// State that we're compressed. // State that we're compressed.
@ -1192,7 +1190,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending)
else else
{ {
// Compression failed to make it smaller; send original // Compression failed to make it smaller; send original
free(compressedsave); free(compressedsave);
// State that we're not compressed // 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); AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0);
save.p = NULL;
// Remember when we started sending the savegame so we can handle timeouts // Remember when we started sending the savegame so we can handle timeouts
sendingsavegame[node] = true; sendingsavegame[node] = true;
@ -1224,20 +1220,22 @@ static void SV_SavedGame(void)
sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home);
// first save it in a malloced buffer // 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) if (!save.p)
{ {
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n"));
return; return;
} }
save.end = save.buffer + save.size;
P_SaveNetGame(&save, false); P_SaveNetGame(&save, false);
length = save.p - save.buffer; length = save.p - save.buffer;
if (length > SAVEGAMESIZE) if (length > NETSAVEGAMESIZE)
{ {
free(save.buffer); free(save.buffer);
save.p = NULL;
I_Error("Savegame buffer overrun"); 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); CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave);
free(save.buffer); free(save.buffer);
save.p = NULL;
} }
#undef TMPSAVENAME #undef TMPSAVENAME
@ -1272,15 +1269,21 @@ static void CL_LoadReceivedSavegame(boolean reloading)
} }
save.p = save.buffer; save.p = save.buffer;
save.size = length;
save.end = save.buffer + save.size;
// Decompress saved game if necessary. // Decompress saved game if necessary.
decompressedlen = READUINT32(save.p); decompressedlen = READUINT32(save.p);
if(decompressedlen > 0) if(decompressedlen > 0)
{ {
UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL); UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL);
lzf_decompress(save.p, length - sizeof(UINT32), decompressedbuffer, decompressedlen); lzf_decompress(save.p, length - sizeof(UINT32), decompressedbuffer, decompressedlen);
Z_Free(save.buffer); Z_Free(save.buffer);
save.p = save.buffer = decompressedbuffer; save.p = save.buffer = decompressedbuffer;
save.size = decompressedlen;
save.end = save.buffer + decompressedlen;
} }
paused = false; paused = false;
@ -6075,6 +6078,8 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
return NULL; return NULL;
save.buffer = save.p = rewind->savebuffer; save.buffer = save.p = rewind->savebuffer;
save.size = NETSAVEGAMESIZE;
save.end = save.buffer + save.size;
P_SaveNetGame(&save, false); P_SaveNetGame(&save, false);
@ -6102,6 +6107,8 @@ rewind_t *CL_RewindToTime(tic_t time)
return NULL; return NULL;
save.buffer = save.p = rewindhead->savebuffer; save.buffer = save.p = rewindhead->savebuffer;
save.size = NETSAVEGAMESIZE;
save.end = save.buffer + save.size;
P_LoadNetGame(&save, false); P_LoadNetGame(&save, false);

View file

@ -22,6 +22,7 @@
#include "mserv.h" #include "mserv.h"
#include "k_pwrlv.h" // PWRLV_NUMTYPES #include "k_pwrlv.h" // PWRLV_NUMTYPES
#include "p_saveg.h" // NETSAVEGAMESIZE
/* /*
The 'packet version' is used to distinguish packet formats. The 'packet version' is used to distinguish packet formats.
@ -530,7 +531,7 @@ extern boolean hu_stopped;
// //
struct rewind_t { struct rewind_t {
UINT8 savebuffer[(768*1024)]; UINT8 savebuffer[NETSAVEGAMESIZE];
tic_t leveltime; tic_t leveltime;
size_t demopos; size_t demopos;

View file

@ -5794,7 +5794,9 @@ static void Command_Archivetest_f(void)
((mobj_t *)th)->mobjnum = i++; ((mobj_t *)th)->mobjnum = i++;
// allocate buffer // 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 // test archive
CONS_Printf("LUA_Archive...\n"); CONS_Printf("LUA_Archive...\n");

View file

@ -72,7 +72,6 @@ tic_t demostarttime; // for comparative timing purposes
static char demoname[MAX_WADPATH]; static char demoname[MAX_WADPATH];
static savebuffer_t demobuf; static savebuffer_t demobuf;
static UINT8 *demotime_p, *demoinfo_p; static UINT8 *demotime_p, *demoinfo_p;
static UINT8 *demoend;
static UINT8 demoflags; static UINT8 demoflags;
boolean demosynced = true; // console warning message boolean demosynced = true; // console warning message
@ -151,7 +150,7 @@ demoghost *ghosts = NULL;
#define ZT_FLAGS 0x80 #define ZT_FLAGS 0x80
// OUT OF ZIPTICS... // OUT OF ZIPTICS...
#define DEMOMARKER 0x80 // demoend #define DEMOMARKER 0x80 // demobuf.end
UINT8 demo_extradata[MAXPLAYERS]; UINT8 demo_extradata[MAXPLAYERS];
UINT8 demo_writerng; // 0=no, 1=yes, 2=yes but on a timeout 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! // attention here for the ticcmd size!
// latest demos with mouse aiming byte in ticcmd // 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 G_CheckDemoStatus(); // no more space
return; return;
@ -703,7 +702,7 @@ void G_WriteAllGhostTics(void)
// attention here for the ticcmd size! // attention here for the ticcmd size!
// latest demos with mouse aiming byte in ticcmd // 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 G_CheckDemoStatus(); // no more space
return; return;
@ -1995,7 +1994,7 @@ void G_WriteMetalTic(mobj_t *metal)
// attention here for the ticcmd size! // attention here for the ticcmd size!
// latest demos with mouse aiming byte in ticcmd // 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 G_StopMetalRecording(false); // no more space
return; return;
@ -2013,13 +2012,17 @@ void G_RecordDemo(const char *name)
strcat(demoname, ".lmp"); strcat(demoname, ".lmp");
//@TODO make a maxdemosize cvar //@TODO make a maxdemosize cvar
maxsize = 1024*1024*2; maxsize = 1024*1024*2;
if (M_CheckParm("-maxdemo") && M_IsNextParm()) if (M_CheckParm("-maxdemo") && M_IsNextParm())
maxsize = atoi(M_GetNextParm()) * 1024; maxsize = atoi(M_GetNextParm()) * 1024;
// if (demobuf.buffer) // if (demobuf.buffer)
// free(demobuf.buffer); // P_SaveBufferFree(&demobuf);
demobuf.size = maxsize;
demobuf.buffer = (UINT8 *)malloc(maxsize);
demobuf.p = NULL; demobuf.p = NULL;
demobuf.buffer = malloc(maxsize); demobuf.end = demobuf.buffer + demobuf.size;
demoend = demobuf.buffer + maxsize;
demo.recording = true; demo.recording = true;
} }
@ -2030,9 +2033,12 @@ void G_RecordMetal(void)
maxsize = 1024*1024; maxsize = 1024*1024;
if (M_CheckParm("-maxdemo") && M_IsNextParm()) if (M_CheckParm("-maxdemo") && M_IsNextParm())
maxsize = atoi(M_GetNextParm()) * 1024; maxsize = atoi(M_GetNextParm()) * 1024;
demobuf.size = maxsize;
demobuf.buffer = (UINT8 *)malloc(maxsize);
demobuf.p = NULL; demobuf.p = NULL;
demobuf.buffer = malloc(maxsize); demobuf.end = demobuf.buffer + demobuf.size;
demoend = demobuf.buffer + maxsize;
metalrecording = true; metalrecording = true;
} }

View file

@ -72,9 +72,6 @@ UINT8 ultimatemode = false;
JoyType_t Joystick[MAXSPLITSCREENPLAYERS]; JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
// 1024 bytes is plenty for a savegame
#define SAVEGAMESIZE (1024)
// SRB2kart // SRB2kart
char gamedatafilename[64] = char gamedatafilename[64] =
#ifdef DEVELOP #ifdef DEVELOP
@ -4531,12 +4528,14 @@ void G_SaveGameData(void)
} }
length += nummapheaders * (MAXMAPLUMPNAME+1+4+4); 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) if (!save.p)
{ {
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
return; return;
} }
save.end = save.buffer + save.size;
// Version test // Version test
@ -4624,7 +4623,6 @@ void G_SaveGameData(void)
FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length); FIL_WriteFile(va(pandf, srb2home, gamedatafilename), save.buffer, length);
free(save.buffer); free(save.buffer);
save.p = save.buffer = NULL;
// Also save profiles here. // Also save profiles here.
PR_SaveProfiles(); PR_SaveProfiles();
@ -4664,6 +4662,8 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
} }
save.p = save.buffer; save.p = save.buffer;
save.size = length;
save.end = save.buffer + save.size;
memset(vcheck, 0, sizeof (vcheck)); memset(vcheck, 0, sizeof (vcheck));
sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); 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); M_StartMessage(M_GetText("Save game from different version\n\nPress ESC\n"), NULL, MM_NOTHING);
Command_ExitGame_f(); Command_ExitGame_f();
Z_Free(save.buffer); Z_Free(save.buffer);
save.p = save.buffer = NULL;
// no cheating! // no cheating!
memset(&savedata, 0, sizeof(savedata)); memset(&savedata, 0, sizeof(savedata));
@ -4714,7 +4713,6 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
// done // done
Z_Free(save.buffer); Z_Free(save.buffer);
save.p = save.buffer = NULL;
// gameaction = ga_nothing; // gameaction = ga_nothing;
// G_SetGamestate(GS_LEVEL); // G_SetGamestate(GS_LEVEL);
@ -4753,12 +4751,14 @@ void G_SaveGame(UINT32 slot, INT16 mapnum)
char name[VERSIONSIZE]; char name[VERSIONSIZE];
size_t length; size_t length;
save.p = save.buffer = (UINT8 *)malloc(SAVEGAMESIZE); save.size = SAVEGAMESIZE;
save.p = save.buffer = (UINT8 *)malloc(save.size);
if (!save.p) if (!save.p)
{ {
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
return; return;
} }
save.end = save.buffer + save.size;
memset(name, 0, sizeof (name)); memset(name, 0, sizeof (name));
sprintf(name, (marathonmode ? "back-up %d" : "version %d"), VERSION); 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; length = save.p - save.buffer;
saved = FIL_WriteFile(backup, save.buffer, length); saved = FIL_WriteFile(backup, save.buffer, length);
free(save.buffer); free(save.buffer);
save.p = save.buffer = NULL;
} }
gameaction = ga_nothing; gameaction = ga_nothing;
@ -4789,7 +4788,7 @@ void G_SaveGame(UINT32 slot, INT16 mapnum)
} }
#define BADSAVE goto cleanup; #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) void G_SaveGameOver(UINT32 slot, boolean modifylives)
{ {
boolean saved = false; boolean saved = false;
@ -4814,11 +4813,13 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives)
{ {
char temp[sizeof(timeattackfolder)]; char temp[sizeof(timeattackfolder)];
UINT8 *end_p = save.buffer + length;
UINT8 *lives_p; UINT8 *lives_p;
SINT8 pllives; SINT8 pllives;
save.p = save.buffer; save.p = save.buffer;
save.size = length;
save.end = save.buffer + save.size;
// Version check // Version check
memset(vcheck, 0, sizeof (vcheck)); memset(vcheck, 0, sizeof (vcheck));
sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION);

View file

@ -219,12 +219,14 @@ void PR_SaveProfiles(void)
UINT8 i, j, k; UINT8 i, j, k;
savebuffer_t save; 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) if (!save.p)
{ {
I_Error("No more free memory for saving profiles\n"); I_Error("No more free memory for saving profiles\n");
return; return;
} }
save.end = save.buffer + save.size;
// Add header. // Add header.
WRITESTRINGN(save.p, PROFILEHEADER, headerlen); 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?"); I_Error("Couldn't save profiles. Are you out of Disk space / playing in a protected folder?");
} }
free(save.buffer); free(save.buffer);
save.p = save.buffer = NULL;
} }
void PR_LoadProfiles(void) void PR_LoadProfiles(void)

View file

@ -18,6 +18,12 @@
#pragma interface #pragma interface
#endif #endif
// 1024 bytes is plenty for a savegame
#define SAVEGAMESIZE (1024)
// For netgames
#define NETSAVEGAMESIZE (768*1024)
// Persistent storage/archiving. // Persistent storage/archiving.
// These are the load / save game routines. // These are the load / save game routines.
@ -43,6 +49,8 @@ struct savebuffer_t
{ {
UINT8 *buffer; UINT8 *buffer;
UINT8 *p; UINT8 *p;
UINT8 *end;
size_t size;
}; };
#endif #endif

View file

@ -725,6 +725,7 @@ void P_WriteThings(void)
savebuffer_t save; savebuffer_t save;
INT16 temp; INT16 temp;
save.size = nummapthings * sizeof (mapthing_t);
save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t)); save.p = save.buffer = (UINT8 *)malloc(nummapthings * sizeof (mapthing_t));
if (!save.p) if (!save.p)
@ -733,6 +734,8 @@ void P_WriteThings(void)
return; return;
} }
save.end = save.buffer + save.size;
mt = mapthings; mt = mapthings;
for (i = 0; i < nummapthings; i++, mt++) for (i = 0; i < nummapthings; i++, mt++)
{ {