Properly fix empty demo crash

This commit is contained in:
GenericHeroGuy 2025-08-08 23:24:16 +02:00
parent d6edfb4303
commit 6c24f4d70c

View file

@ -276,6 +276,7 @@ typedef struct
UINT8 numplayers;
demoplayer_t *playerdata;
boolean empty;
UINT32 endofs;
} demoheader_t;
@ -669,6 +670,7 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header)
header->mapmusrng = 0;
header->numlaps = 0;
header->raflags = 0;
header->empty = false;
if (memcmp(dp, DEMOHEADER, 12))
return HEADER_BADMAGIC;
@ -687,7 +689,6 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header)
raflag = false;
break;
case 0x0001: // SRB2Kart 1.0.x (only staff ghosts supported)
oldkart = kart = true;
raflag = false;
@ -847,10 +848,16 @@ skipfiles:
if (!kart)
header->mapmusrng = READUINT8(dp);
// Sigh ... it's an empty demo.
if (*dp == DEMOMARKER || oldkart)
if (oldkart)
goto end;
// Sigh ... it's an empty demo.
if (*dp == DEMOMARKER)
{
header->empty = true;
goto end;
}
// Load players that were in-game when the map started
UINT8 playernum;
header->playerdata = NULL;
@ -901,6 +908,10 @@ skipfiles:
plr->followitem = !kart ? READUINT32(dp) : MT_NULL;
}
// Sigh ... it's an empty demo. Again.
if (*dp == DEMOMARKER)
header->empty = true;
end:
header->endofs = dp - startdp;
return HEADER_OK;
@ -3658,7 +3669,7 @@ void G_DoPlayDemo(char *defdemoname)
mapmusrng = header.mapmusrng;
// Sigh ... it's an empty demo.
if (header.numplayers == 0)
if (header.empty)
{
snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname);
CONS_Alert(CONS_ERROR, "%s", msg);
@ -3957,7 +3968,7 @@ void G_AddGhost(char *defdemoname)
return;
}
if (buffer[header.endofs] == DEMOMARKER || header.numplayers == 0)
if (header.empty)
{
CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Replay is empty.\n"), pdemoname);
Z_Free(pdemoname);