From 7f5b409c5cbe12bbf25e65ca0d9a4f729631edcd Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Fri, 4 Jul 2025 04:54:53 +0800 Subject: [PATCH] fix: Memory leak after delete client #143 --- client/IOCPUDPClient.cpp | 3 +++ client/KernelManager.cpp | 3 +-- server/2015Remote/2015RemoteDlg.cpp | 11 +++++++++-- server/2015Remote/IOCPUDPServer.cpp | 3 +++ server/2015Remote/IOCPUDPServer.h | 9 +++++---- server/2015Remote/Server.h | 9 ++++++--- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/client/IOCPUDPClient.cpp b/client/IOCPUDPClient.cpp index 5814d96..9a8c6f9 100644 --- a/client/IOCPUDPClient.cpp +++ b/client/IOCPUDPClient.cpp @@ -56,5 +56,8 @@ int IOCPUDPClient::ReceiveData(char* buffer, int bufSize, int flags) { } int IOCPUDPClient::SendTo(const char* buf, int len, int flags) { + if (len > 1200) { + Mprintf("UDP large packet may lost: %d bytes\n", len); + } return ::sendto(m_sClientSocket, buf, len, flags, (sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr)); } diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 443d877..20b41b6 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -369,8 +369,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case SERVER_EXIT: { - BYTE bToken = SERVER_EXIT;// ض˳ - m_ClientObject->Send2Server((char*)&bToken, 1); + // ض˳ g_bExit = S_SERVER_EXIT; Mprintf("======> Server exit \n"); break; diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 87f625b..aff87dc 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1718,7 +1718,7 @@ std::string getDateStr(int daysOffset = 0) { VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) { if (isClosed) { - return; + return ContextObject->Destroy(); } unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0); unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen(); @@ -1758,6 +1758,8 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) memcpy(resp + 64, hmac.c_str(), hmac.length()); resp[80] = 0; ContextObject->Send2Client((LPBYTE)resp, sizeof(resp)); + Sleep(20); + ContextObject->Destroy(); break; } case CMD_EXECUTE_DLL: // 请求DLL @@ -1766,9 +1768,13 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) for (std::vector::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){ DllInfo* dll = *i; if (dll->Name == info->Name) { - return ContextObject->Send2Client( dll->Data->Buf(), dll->Data->length()); + // TODO 如果是UDP,发送大包数据基本上不可能成功 + ContextObject->Send2Client( dll->Data->Buf(), dll->Data->length()); + break; } } + Sleep(20); + ContextObject->Destroy(); break; } case COMMAND_PROXY: @@ -1802,6 +1808,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) CancelIo((HANDLE)ContextObject->sClientSocket); closesocket(ContextObject->sClientSocket); Sleep(10); + ContextObject->Destroy(); break; } case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理 diff --git a/server/2015Remote/IOCPUDPServer.cpp b/server/2015Remote/IOCPUDPServer.cpp index bcdca11..1742725 100644 --- a/server/2015Remote/IOCPUDPServer.cpp +++ b/server/2015Remote/IOCPUDPServer.cpp @@ -120,6 +120,9 @@ VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, U ContextObject->OutCompressedBuffer.GetBufferLength(), (CHAR*)ContextObject->OutCompressedBuffer.GetBuffer(), }; + if (buf.len > 1200) { + Mprintf("UDP large packet may lost: %d bytes\n", buf.len); + } DWORD sent = 0; CONTEXT_UDP* ctx = (CONTEXT_UDP*)ContextObject; int err = WSASendTo( diff --git a/server/2015Remote/IOCPUDPServer.h b/server/2015Remote/IOCPUDPServer.h index 497af77..f81d271 100644 --- a/server/2015Remote/IOCPUDPServer.h +++ b/server/2015Remote/IOCPUDPServer.h @@ -7,9 +7,10 @@ class IOCPUDPServer : public Server { struct IO_CONTEXT { - OVERLAPPED ol; - CONTEXT_UDP* pContext; - IO_CONTEXT(CONTEXT_UDP* ctx) : ol({}), pContext(ctx) { } + OVERLAPPED ol = {}; + CONTEXT_UDP* pContext = nullptr; + IO_CONTEXT() : ol({}), pContext(new CONTEXT_UDP) { + } ~IO_CONTEXT() { SAFE_DELETE(pContext); } @@ -30,7 +31,7 @@ private: void PostRecv(); IO_CONTEXT* AddCount(){ m_locker.lock(); - IO_CONTEXT* ioCtx = new IO_CONTEXT(new CONTEXT_UDP()); + IO_CONTEXT* ioCtx = new IO_CONTEXT(); ioCtx->pContext->InitMember(m_socket, this); m_count++; m_locker.unlock(); diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index 1788b87..ef729d6 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -479,9 +479,12 @@ typedef CList ContextObjectList; class CONTEXT_UDP : public CONTEXT_OBJECT { public: - int addrLen; - sockaddr_in clientAddr; - + int addrLen = 0; + sockaddr_in clientAddr = {}; + CONTEXT_UDP() { + } + virtual ~CONTEXT_UDP() { + } std::string GetProtocol() const override { return "UDP"; }