From 6c24f4d70c815824fe000a524cccbe159ca6cf94 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Fri, 8 Aug 2025 23:24:16 +0200 Subject: [PATCH] Properly fix empty demo crash --- src/g_demo.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 76552ebb1..ffca19191 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -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);