Rob Shearman : rpcrt4: Add a reference to the binding object in I_RpcNegotiateTransferSyntax and release the reference in I_RpcFreeBuffer .
Alexandre Julliard
julliard at winehq.org
Tue Apr 1 16:44:12 CDT 2008
Module: wine
Branch: master
Commit: 8aeb2858e44627c2002b9a20483a2a9c78a2aa3f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8aeb2858e44627c2002b9a20483a2a9c78a2aa3f
Author: Rob Shearman <rob at codeweavers.com>
Date: Tue Apr 1 12:48:15 2008 +0100
rpcrt4: Add a reference to the binding object in I_RpcNegotiateTransferSyntax and release the reference in I_RpcFreeBuffer.
This is needed because a context binding handle could be released on
unmarshall, but it still needs to stay valid until the binding handle is
no longer being used.
Re-use the previously unused RPCRT4_ExportBinding function as
RPCRT4_AddRefBinding and rename RPCRT4_DestroyBinding to
RPCRT4_ReleaseBinding to show that it's purpose is to release a
reference count and destroy if necessary, not always destroy.
---
dlls/rpcrt4/rpc_binding.c | 14 ++++++--------
dlls/rpcrt4/rpc_binding.h | 4 ++--
dlls/rpcrt4/rpc_message.c | 4 ++++
dlls/rpcrt4/rpc_transport.c | 2 +-
4 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/dlls/rpcrt4/rpc_binding.c b/dlls/rpcrt4/rpc_binding.c
index 7293032..d670a88 100644
--- a/dlls/rpcrt4/rpc_binding.c
+++ b/dlls/rpcrt4/rpc_binding.c
@@ -249,14 +249,12 @@ RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection)
return RPC_S_OK;
}
-RPC_STATUS RPCRT4_ExportBinding(RpcBinding** Binding, RpcBinding* OldBinding)
+void RPCRT4_AddRefBinding(RpcBinding* Binding)
{
- InterlockedIncrement(&OldBinding->refs);
- *Binding = OldBinding;
- return RPC_S_OK;
+ InterlockedIncrement(&Binding->refs);
}
-RPC_STATUS RPCRT4_DestroyBinding(RpcBinding* Binding)
+RPC_STATUS RPCRT4_ReleaseBinding(RpcBinding* Binding)
{
if (InterlockedDecrement(&Binding->refs))
return RPC_S_OK;
@@ -661,7 +659,7 @@ RPC_STATUS WINAPI RpcBindingFree( RPC_BINDING_HANDLE* Binding )
{
RPC_STATUS status;
TRACE("(%p) = %p\n", Binding, *Binding);
- status = RPCRT4_DestroyBinding(*Binding);
+ status = RPCRT4_ReleaseBinding(*Binding);
if (status == RPC_S_OK) *Binding = 0;
return status;
}
@@ -741,7 +739,7 @@ RPC_STATUS WINAPI RpcBindingFromStringBindingA( RPC_CSTR StringBinding, RPC_BIND
if (ret == RPC_S_OK)
*Binding = (RPC_BINDING_HANDLE)bind;
else
- RPCRT4_DestroyBinding(bind);
+ RPCRT4_ReleaseBinding(bind);
return ret;
}
@@ -780,7 +778,7 @@ RPC_STATUS WINAPI RpcBindingFromStringBindingW( RPC_WSTR StringBinding, RPC_BIND
if (ret == RPC_S_OK)
*Binding = (RPC_BINDING_HANDLE)bind;
else
- RPCRT4_DestroyBinding(bind);
+ RPCRT4_ReleaseBinding(bind);
return ret;
}
diff --git a/dlls/rpcrt4/rpc_binding.h b/dlls/rpcrt4/rpc_binding.h
index e169a65..3251df2 100644
--- a/dlls/rpcrt4/rpc_binding.h
+++ b/dlls/rpcrt4/rpc_binding.h
@@ -145,8 +145,8 @@ RPC_STATUS RPCRT4_SpawnConnection(RpcConnection** Connection, RpcConnection* Old
RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPCSTR Endpoint);
RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, const UUID* ObjectUuid);
RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection);
-RPC_STATUS RPCRT4_ExportBinding(RpcBinding** Binding, RpcBinding* OldBinding);
-RPC_STATUS RPCRT4_DestroyBinding(RpcBinding* Binding);
+void RPCRT4_AddRefBinding(RpcBinding* Binding);
+RPC_STATUS RPCRT4_ReleaseBinding(RpcBinding* Binding);
RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection,
const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RPC_SYNTAX_IDENTIFIER *InterfaceId);
RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection);
diff --git a/dlls/rpcrt4/rpc_message.c b/dlls/rpcrt4/rpc_message.c
index bc33c87..3b1e68d 100644
--- a/dlls/rpcrt4/rpc_message.c
+++ b/dlls/rpcrt4/rpc_message.c
@@ -1017,7 +1017,10 @@ RPC_STATUS WINAPI I_RpcNegotiateTransferSyntax(PRPC_MESSAGE pMsg)
&cif->InterfaceId);
if (status == RPC_S_OK)
+ {
pMsg->ReservedForRuntime = conn;
+ RPCRT4_AddRefBinding(bind);
+ }
}
return status;
@@ -1114,6 +1117,7 @@ RPC_STATUS WINAPI I_RpcFreeBuffer(PRPC_MESSAGE pMsg)
{
RpcConnection *conn = pMsg->ReservedForRuntime;
RPCRT4_CloseBinding(bind, conn);
+ RPCRT4_ReleaseBinding(bind);
pMsg->ReservedForRuntime = NULL;
}
I_RpcFree(pMsg->Buffer);
diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c
index 822807b..8bca0fe 100644
--- a/dlls/rpcrt4/rpc_transport.c
+++ b/dlls/rpcrt4/rpc_transport.c
@@ -1551,7 +1551,7 @@ RPC_STATUS RPCRT4_DestroyConnection(RpcConnection* Connection)
if (Connection->QOS) RpcQualityOfService_Release(Connection->QOS);
/* server-only */
- if (Connection->server_binding) RPCRT4_DestroyBinding(Connection->server_binding);
+ if (Connection->server_binding) RPCRT4_ReleaseBinding(Connection->server_binding);
HeapFree(GetProcessHeap(), 0, Connection);
return RPC_S_OK;
More information about the wine-cvs
mailing list