From c4d339c5c01017e292ef2d588a8bb0848132d107 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sun, 2 Jun 2019 13:05:05 +0000 Subject: [PATCH] Fix SZ_GetSpace overflows when recording mvds. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5465 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/server/sv_send.c | 44 ++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index 98b038b68..98f9919d9 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -2833,6 +2833,21 @@ static qboolean SV_SyncInfoBuf(client_t *client) ClientReliableWrite_Begin(client, svc_stufftext, strlen(s)+2); ClientReliableWrite_String(client, s); } +#ifdef MVD_RECORDING + else if (client == &demo.recorder) + { + sizebuf_t *buf = MVDWrite_Begin(dem_all, 0, 2+strlen(key)+1+strlen(blobdata)+1); + if (info == &svs.info) + MSG_WriteByte(buf, svc_serverinfo); + else + { + MSG_WriteByte(buf, svc_setinfo); + MSG_WriteByte(buf, (client_t*)((char*)info-(char*)&((client_t*)NULL)->userinfo)-svs.clients); + } + MSG_WriteString(buf, key); + MSG_WriteString(buf, blobdata); + } +#endif else { if (info == &svs.info) @@ -2869,12 +2884,27 @@ static qboolean SV_SyncInfoBuf(client_t *client) sendsize = min(bufferspace, sendsize); final = (bloboffset+sendsize >= blobsize); - ClientReliableWrite_Begin(client, svcfte_setinfoblob, 8+strlen(enckey)+1+sendsize); - ClientReliableWrite_Byte(client, pl); //special meaning to say that this is a partial update - ClientReliableWrite_String(client, enckey); - ClientReliableWrite_Long(client, (final?0x80000000:0)|bloboffset); - ClientReliableWrite_Short(client, sendsize); - ClientReliableWrite_SZ(client, blobdata+bloboffset, sendsize); +#ifdef MVD_RECORDING + if (client == &demo.recorder) + { + sizebuf_t *buf = MVDWrite_Begin(dem_all, 0, 8+strlen(enckey)+1+sendsize); + MSG_WriteByte(buf, svcfte_setinfoblob); + MSG_WriteByte(buf, pl); //special meaning to say that this is a partial update + MSG_WriteString(buf, enckey); + MSG_WriteLong(buf, (final?0x80000000:0)|bloboffset); + MSG_WriteShort(buf, sendsize); + SZ_Write(buf, blobdata+bloboffset, sendsize); + } + else +#endif + { + ClientReliableWrite_Begin(client, svcfte_setinfoblob, 8+strlen(enckey)+1+sendsize); + ClientReliableWrite_Byte(client, pl); //special meaning to say that this is a partial update + ClientReliableWrite_String(client, enckey); + ClientReliableWrite_Long(client, (final?0x80000000:0)|bloboffset); + ClientReliableWrite_Short(client, sendsize); + ClientReliableWrite_SZ(client, blobdata+bloboffset, sendsize); + } if (!final) { @@ -3112,7 +3142,7 @@ void SV_UpdateToReliableMessages (void) } #ifdef MVD_RECORDING - if (sv.mvdrecording) + if (sv.mvdrecording && demo.recorder.infosync.numkeys) { while (demo.recorder.infosync.numkeys) {