I'm never calling you again

This causes buffer overflow sometimes due to not being resized.
This commit is contained in:
NepDisk 2025-06-26 09:57:23 -04:00
parent ea07280348
commit 7226fd120e
5 changed files with 14 additions and 17 deletions

View file

@ -2815,11 +2815,11 @@ void D_SetupVote(void)
hellpick = 1;
if (i == 2) // sometimes a different gametype
m = G_RandMap(G_TOLFlag(secondgt), prevmap, ((secondgt != gametype) ? 2 : 0), 0, true, votebuffer);
m = G_RandMap(G_TOLFlag(secondgt), prevmap, ((secondgt != gametype) ? 2 : 0), 0, votebuffer);
else if (i >= VOTEROWS) // unknown-random and formerly force-unknown MAP HELL
m = G_RandMap(G_TOLFlag(gt), prevmap, 0, hellpick, (i < VOTEROWSADDSONE), votebuffer);
m = G_RandMap(G_TOLFlag(gt), prevmap, 0, hellpick, votebuffer);
else
m = G_RandMap(G_TOLFlag(gt), prevmap, 0, 0, true, votebuffer);
m = G_RandMap(G_TOLFlag(gt), prevmap, 0, 0, votebuffer);
if (i < VOTEROWS)
votebuffer[min(i, 2)] = m; // min() is a dumb workaround for gcc 4.4 array-bounds error
WRITEUINT16(p, m);
@ -3354,7 +3354,7 @@ static void Command_RandomMap(void)
oldmapnum = -1;
}
newmapnum = G_RandMap(G_TOLFlag(newgametype), oldmapnum, 0, 0, false, NULL) + 1;
newmapnum = G_RandMap(G_TOLFlag(newgametype), oldmapnum, 0, 0, NULL) + 1;
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
}

View file

@ -1596,7 +1596,7 @@ void F_TitleScreenTicker(boolean run)
// prevent console spam if failed
demoIdleLeft = demoIdleTime;
mapnum = G_RandMap(TOL_RACE, -2, 2, 0, false, NULL);
mapnum = G_RandMap(TOL_RACE, -2, 2, 0, NULL);
if (mapnum == 0) // gotta have ONE
{
return;

View file

@ -3778,11 +3778,11 @@ static INT32 TOLMaps(UINT8 pgametype)
* has those flags.
* \author Graue <graue@oceanbase.org>
*/
static INT16 *okmaps = NULL;
INT16 G_RandMap(UINT32 tolflags, INT16 pprevmap, UINT8 ignorebuffer, UINT8 maphell, boolean callagainsoon, INT16 *extbuffer)
INT16 G_RandMap(UINT32 tolflags, INT16 pprevmap, UINT8 ignorebuffer, UINT8 maphell, INT16 *extbuffer)
{
UINT32 numokmaps = 0;
INT16 ix, bufx;
INT16 *okmaps = NULL;
UINT16 extbufsize = 0;
boolean usehellmaps; // Only consider Hell maps in this pick
@ -3924,12 +3924,9 @@ tryagain:
ix = okmaps[M_RandomKey(numokmaps)];
}
if (!callagainsoon)
{
//CONS_Printf("(freeing okmaps)\n");
Z_Free(okmaps);
okmaps = NULL;
}
//CONS_Printf("(freeing okmaps)\n");
Z_Free(okmaps);
okmaps = NULL;
return ix;
}
@ -4196,7 +4193,7 @@ static INT16 G_GetNextMap(boolean advancemap)
}
else if (cv_advancemap.value == 2) // Go to random map.
{
newmap = G_RandMap(G_TOLFlag(gametype), curmap, 0, 0, false, NULL);
newmap = G_RandMap(G_TOLFlag(gametype), curmap, 0, 0, NULL);
}
else if (nextmap >= NEXTMAP_SPECIAL) // Loop back around
{

View file

@ -275,7 +275,7 @@ FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics);
UINT32 G_TOLFlag(INT32 pgametype);
INT16 G_GetFirstMapOfGametype(UINT8 pgametype);
INT16 G_RandMap(UINT32 tolflags, INT16 pprevmap, UINT8 ignorebuffer, UINT8 maphell, boolean callagainsoon, INT16 *extbuffer);
INT16 G_RandMap(UINT32 tolflags, INT16 pprevmap, UINT8 ignorebuffer, UINT8 maphell, INT16 *extbuffer);
void G_AddMapToBuffer(INT16 map);
#ifdef __cplusplus

View file

@ -4482,7 +4482,7 @@ INT32 MR_PlaybackQuit(INT32 choice)
INT32 MR_ChangeLevel(INT32 choice)
{
(void)choice;
INT16 map = cv_nextmap.value ? cv_nextmap.value : G_RandMap(G_TOLFlag(cv_newgametype.value), gamestate == GS_LEVEL ? gamemap-1 : prevmap, 0, 0, false, NULL);
INT16 map = cv_nextmap.value ? cv_nextmap.value : G_RandMap(G_TOLFlag(cv_newgametype.value), gamestate == GS_LEVEL ? gamemap-1 : prevmap, 0, 0, NULL);
M_ClearMenus(true);
COM_BufAddText(va("map %d -gametype \"%s\"\n", map, cv_newgametype.string));
return true;
@ -6368,7 +6368,7 @@ INT32 MR_StartServer(INT32 choice)
G_StopMetalDemo();
if (!cv_nextmap.value)
CV_SetValue(&cv_nextmap, G_RandMap(G_TOLFlag(cv_newgametype.value), -1, 0, 0, false, NULL)+1);
CV_SetValue(&cv_nextmap, G_RandMap(G_TOLFlag(cv_newgametype.value), -1, 0, 0, NULL)+1);
if (cv_maxplayers.value < ssplayers+1)
CV_SetValue(&cv_maxplayers, ssplayers+1);