Module: wine Branch: refs/heads/master Commit: b36d5fa11fd6e4a155ba5023a633e2c05585c316 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b36d5fa11fd6e4a155ba5023...
Author: Robert Shearman rob@codeweavers.com Date: Thu Apr 20 11:44:53 2006 +0100
rpcrt4: Fix some memory leaks.
---
dlls/rpcrt4/rpc_binding.c | 5 +++++ dlls/rpcrt4/rpc_server.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/rpcrt4/rpc_binding.c b/dlls/rpcrt4/rpc_binding.c index 63f0259..9b3e705 100644 --- a/dlls/rpcrt4/rpc_binding.c +++ b/dlls/rpcrt4/rpc_binding.c @@ -446,6 +446,7 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding InterfaceId, TransferSyntax);
status = RPCRT4_Send(*Connection, hdr, NULL, 0); + RPCRT4_FreeHeader(hdr); if (status != RPC_S_OK) { RPCRT4_DestroyConnection(*Connection); return status; @@ -461,6 +462,7 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding count = rpcrt4_conn_read(NewConnection, response, RPC_MAX_PACKET_SIZE); if (count < sizeof(response_hdr->common)) { WARN("received invalid header\n"); + HeapFree(GetProcessHeap(), 0, response); RPCRT4_DestroyConnection(*Connection); return RPC_S_PROTOCOL_ERROR; } @@ -471,12 +473,14 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding response_hdr->common.rpc_ver_minor != RPC_VER_MINOR || response_hdr->common.ptype != PKT_BIND_ACK) { WARN("invalid protocol version or rejection packet\n"); + HeapFree(GetProcessHeap(), 0, response); RPCRT4_DestroyConnection(*Connection); return RPC_S_PROTOCOL_ERROR; }
if (response_hdr->bind_ack.max_tsize < RPC_MIN_PACKET_SIZE) { WARN("server doesn't allow large enough packets\n"); + HeapFree(GetProcessHeap(), 0, response); RPCRT4_DestroyConnection(*Connection); return RPC_S_PROTOCOL_ERROR; } @@ -485,6 +489,7 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding
(*Connection)->MaxTransmissionSize = response_hdr->bind_ack.max_tsize; (*Connection)->ActiveInterface = *InterfaceId; + HeapFree(GetProcessHeap(), 0, response); }
return RPC_S_OK; diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c index d8eaa6b..96b3a44 100644 --- a/dlls/rpcrt4/rpc_server.c +++ b/dlls/rpcrt4/rpc_server.c @@ -261,7 +261,9 @@ static void RPCRT4_process_packet(RpcCon conn->MaxTransmissionSize = hdr->bind.max_tsize; }
- if (RPCRT4_Send(conn, response, NULL, 0) != RPC_S_OK) + status = RPCRT4_Send(conn, response, NULL, 0); + RPCRT4_FreeHeader(response); + if (status != RPC_S_OK) goto fail;
break; @@ -275,6 +277,7 @@ static void RPCRT4_process_packet(RpcCon status);
RPCRT4_Send(conn, response, NULL, 0); + RPCRT4_FreeHeader(response); break; }
@@ -342,6 +345,7 @@ fail: msg->Buffer = NULL; RPCRT4_FreeHeader(hdr); TlsSetValue(worker_tls, NULL); + HeapFree(GetProcessHeap(), 0, msg); }
static DWORD CALLBACK RPCRT4_worker_thread(LPVOID the_arg) @@ -414,6 +418,7 @@ static DWORD CALLBACK RPCRT4_io_thread(L status = RPCRT4_Receive(conn, &hdr, msg); if (status != RPC_S_OK) { WARN("receive failed with error %lx\n", status); + HeapFree(GetProcessHeap(), 0, msg); break; }
@@ -430,7 +435,6 @@ #else #endif msg = NULL; } - HeapFree(GetProcessHeap(), 0, msg); RPCRT4_DestroyConnection(conn); return 0; } @@ -1001,6 +1005,8 @@ RPC_STATUS WINAPI RpcMgmtWaitServerListe
LeaveCriticalSection(&listen_cs);
+ FIXME("not waiting for server calls to finish\n"); + return RPC_S_OK; }