From 0a25f5e0fe8e8360d382345462220e7b8555460f Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Fri, 4 Aug 2023 17:45:30 +0200 Subject: [PATCH] Adjust 'CNetConBase' vftable order Order has been adjusted to match the order of execution. --- r5dev/engine/shared/base_rcon.cpp | 174 +++++++++++++++--------------- r5dev/engine/shared/base_rcon.h | 12 +-- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/r5dev/engine/shared/base_rcon.cpp b/r5dev/engine/shared/base_rcon.cpp index 063c0544..f7e2fb21 100644 --- a/r5dev/engine/shared/base_rcon.cpp +++ b/r5dev/engine/shared/base_rcon.cpp @@ -8,6 +8,93 @@ #include "engine/net.h" #include "shared_rcon.h" +//----------------------------------------------------------------------------- +// Purpose: connect to remote +// Input : *pHostName - +// nPort - +// Output : true on success, false otherwise +//----------------------------------------------------------------------------- +bool CNetConBase::Connect(const char* pHostName, const int nPort) +{ + return CL_NetConConnect(this, pHostName, nPort); +} + +//----------------------------------------------------------------------------- +// Purpose: parses input response buffer using length-prefix framing +// Input : &data - +// *pRecvBuf - +// nRecvLen - +// nMaxLen - +// Output: true on success, false otherwise +//----------------------------------------------------------------------------- +bool CNetConBase::ProcessBuffer(CConnectedNetConsoleData& data, + const char* pRecvBuf, int nRecvLen, const int nMaxLen) +{ + bool bSuccess = true; + + while (nRecvLen > 0) + { + if (data.m_nPayloadLen) + { + if (data.m_nPayloadRead < data.m_nPayloadLen) + { + data.m_RecvBuffer[data.m_nPayloadRead++] = *pRecvBuf; + + pRecvBuf++; + nRecvLen--; + } + if (data.m_nPayloadRead == data.m_nPayloadLen) + { + if (!ProcessMessage( + reinterpret_cast(data.m_RecvBuffer.data()), data.m_nPayloadLen) + && bSuccess) + { + bSuccess = false; + } + + data.m_nPayloadLen = 0; + data.m_nPayloadRead = 0; + } + } + else if (data.m_nPayloadRead+1 <= sizeof(int)) // Read size field. + { + data.m_RecvBuffer[data.m_nPayloadRead++] = *pRecvBuf; + + pRecvBuf++; + nRecvLen--; + } + else // Build prefix. + { + data.m_nPayloadLen = int(ntohl(*reinterpret_cast(&data.m_RecvBuffer[0]))); + data.m_nPayloadRead = 0; + + if (!data.m_bAuthorized && nMaxLen > -1) + { + if (data.m_nPayloadLen > nMaxLen) + { + Disconnect("overflow"); // Sending large messages while not authenticated. + return false; + } + } + + if (data.m_nPayloadLen < 0 || + data.m_nPayloadLen > data.m_RecvBuffer.max_size()) + { + Error(eDLL_T::ENGINE, NO_ERROR, "RCON Cmd: sync error (%d)\n", data.m_nPayloadLen); + Disconnect("desync"); // Out of sync (irrecoverable). + + return false; + } + else + { + data.m_RecvBuffer.resize(data.m_nPayloadLen); + } + } + } + + return bSuccess; +} + //----------------------------------------------------------------------------- // Purpose: encode message to buffer // Input : *pMsg - @@ -34,17 +121,6 @@ bool CNetConBase::Decode(google::protobuf::MessageLite* pMsg, return pMsg->ParseFromArray(pMsgBuf, int(nMsgLen)); } -//----------------------------------------------------------------------------- -// Purpose: connect to remote -// Input : *pHostName - -// nPort - -// Output : true on success, false otherwise -//----------------------------------------------------------------------------- -bool CNetConBase::Connect(const char* pHostName, const int nPort) -{ - return CL_NetConConnect(this, pHostName, nPort); -} - //----------------------------------------------------------------------------- // Purpose: send message to specific connected socket // Input : hSocket - @@ -124,79 +200,3 @@ void CNetConBase::Recv(CConnectedNetConsoleData& data, const int nMaxLen) return; } - -//----------------------------------------------------------------------------- -// Purpose: parses input response buffer using length-prefix framing -// Input : &data - -// *pRecvBuf - -// nRecvLen - -// nMaxLen - -// Output: true on success, false otherwise -//----------------------------------------------------------------------------- -bool CNetConBase::ProcessBuffer(CConnectedNetConsoleData& data, - const char* pRecvBuf, int nRecvLen, const int nMaxLen) -{ - bool bSuccess = true; - - while (nRecvLen > 0) - { - if (data.m_nPayloadLen) - { - if (data.m_nPayloadRead < data.m_nPayloadLen) - { - data.m_RecvBuffer[data.m_nPayloadRead++] = *pRecvBuf; - - pRecvBuf++; - nRecvLen--; - } - if (data.m_nPayloadRead == data.m_nPayloadLen) - { - if (!ProcessMessage( - reinterpret_cast(data.m_RecvBuffer.data()), data.m_nPayloadLen) - && bSuccess) - { - bSuccess = false; - } - - data.m_nPayloadLen = 0; - data.m_nPayloadRead = 0; - } - } - else if (data.m_nPayloadRead+1 <= sizeof(int)) // Read size field. - { - data.m_RecvBuffer[data.m_nPayloadRead++] = *pRecvBuf; - - pRecvBuf++; - nRecvLen--; - } - else // Build prefix. - { - data.m_nPayloadLen = int(ntohl(*reinterpret_cast(&data.m_RecvBuffer[0]))); - data.m_nPayloadRead = 0; - - if (!data.m_bAuthorized && nMaxLen > -1) - { - if (data.m_nPayloadLen > nMaxLen) - { - Disconnect("overflow"); // Sending large messages while not authenticated. - return false; - } - } - - if (data.m_nPayloadLen < 0 || - data.m_nPayloadLen > data.m_RecvBuffer.max_size()) - { - Error(eDLL_T::ENGINE, NO_ERROR, "RCON Cmd: sync error (%d)\n", data.m_nPayloadLen); - Disconnect("desync"); // Out of sync (irrecoverable). - - return false; - } - else - { - data.m_RecvBuffer.resize(data.m_nPayloadLen); - } - } - } - - return bSuccess; -} diff --git a/r5dev/engine/shared/base_rcon.h b/r5dev/engine/shared/base_rcon.h index e49b89a6..f46ad20e 100644 --- a/r5dev/engine/shared/base_rcon.h +++ b/r5dev/engine/shared/base_rcon.h @@ -11,18 +11,18 @@ public: CNetConBase(void) {} - virtual bool Encode(google::protobuf::MessageLite* pMsg, char* pMsgBuf, const size_t nMsgLen) const; - virtual bool Decode(google::protobuf::MessageLite* pMsg, const char* pMsgBuf, const size_t nMsgLen) const; - virtual bool Connect(const char* pHostAdr, const int nHostPort = SOCKET_ERROR); virtual void Disconnect(const char* szReason = nullptr) { NOTE_UNUSED(szReason); }; - virtual bool Send(const SocketHandle_t hSocket, const char* pMsgBuf, const int nMsgLen) const; - virtual void Recv(CConnectedNetConsoleData& data, const int nMaxLen = SOCKET_ERROR); - virtual bool ProcessBuffer(CConnectedNetConsoleData& data, const char* pRecvBuf, int nRecvLen, const int nMaxLen = SOCKET_ERROR); virtual bool ProcessMessage(const char* /*pMsgBuf*/, int /*nMsgLen*/) { return true; }; + virtual bool Encode(google::protobuf::MessageLite* pMsg, char* pMsgBuf, const size_t nMsgLen) const; + virtual bool Decode(google::protobuf::MessageLite* pMsg, const char* pMsgBuf, const size_t nMsgLen) const; + + virtual bool Send(const SocketHandle_t hSocket, const char* pMsgBuf, const int nMsgLen) const; + virtual void Recv(CConnectedNetConsoleData& data, const int nMaxLen = SOCKET_ERROR); + CSocketCreator* GetSocketCreator(void) { return &m_Socket; } netadr_t* GetNetAddress(void) { return &m_Address; }