diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp index f1c561c22..66b1d6b26 100644 --- a/renderdoc/core/remote_server.cpp +++ b/renderdoc/core/remote_server.cpp @@ -180,6 +180,8 @@ static bool HandleHandshakeClient(ActiveClient &activeClient, ClientThread *thre { ReadSerialiser ser(new StreamReader(threadData->socket, Ownership::Nothing), Ownership::Stream); + ser.SetStreamingMode(true); + // this thread just handles receiving the handshake and sending a busy signal without blocking // the server thread RemoteServerPacket type = ser.ReadChunk(); @@ -1206,6 +1208,8 @@ RENDERDOC_CreateRemoteServerConnection(const rdcstr &URL, IRemoteServer **rend) { ReadSerialiser ser(new StreamReader(sock, Ownership::Nothing), Ownership::Stream); + ser.SetStreamingMode(true); + RemoteServerPacket type = ser.ReadChunk(); uint32_t remoteVersion = 0; diff --git a/renderdoc/core/target_control.cpp b/renderdoc/core/target_control.cpp index cc0dd77d3..716e6c38a 100644 --- a/renderdoc/core/target_control.cpp +++ b/renderdoc/core/target_control.cpp @@ -471,6 +471,8 @@ void RenderDoc::TargetControlServerThread(Network::Socket *sock) { ReadSerialiser ser(new StreamReader(client, Ownership::Nothing), Ownership::Stream); + ser.SetStreamingMode(true); + PacketType type = ser.ReadChunk(); if(type != ePacket_Handshake) diff --git a/renderdoc/serialise/serialiser.cpp b/renderdoc/serialise/serialiser.cpp index ee759ad87..7cb2a8ce6 100644 --- a/renderdoc/serialise/serialiser.cpp +++ b/renderdoc/serialise/serialiser.cpp @@ -179,6 +179,13 @@ uint32_t Serialiser::BeginChunk(uint32_t, uint64_t) m_ChunkMetadata.length = chunkSize; } + uint64_t len = m_ChunkMetadata.length; + VerifyArraySize(m_ChunkMetadata.length); + // if length was set to 0 by VerifyArraySize due to being invalid, set it to something + // reasonable just to prevent knock-on problems with error handling + if(len != 0 && m_ChunkMetadata.length == 0) + m_ChunkMetadata.length = 1024; + m_LastChunkOffset = m_Read->GetOffset(); }