mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 02:25:17 +00:00
Sync to Wine-20050419:
Robert Shearman <rob@codeweavers.com> - Fix deadlock caused by not leaving the critical section on all code paths. - RpcMgmtStopServerListen should not affect auto-listen interfaces. - Implement stub for RpcRevertToSelfEx. - Change the more verbose files to use a new debug channel, "rpc." Francois Gouget <fgouget@free.fr> - Assorted spelling fixes. Jakob Eriksson <jakov@vmlinux.org> - Get rid of HeapAlloc casts. Ralf S. Engelschall <rse@engelschall.com> - Fix incorrect random multicast MAC address creation. svn path=/trunk/; revision=15018
This commit is contained in:
parent
d0bf4f6953
commit
dff6294185
6 changed files with 79 additions and 43 deletions
|
@ -44,7 +44,7 @@
|
||||||
#include "ndr_misc.h"
|
#include "ndr_misc.h"
|
||||||
#include "rpcndr.h"
|
#include "rpcndr.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* NdrProxyInitialize [RPCRT4.@]
|
* NdrProxyInitialize [RPCRT4.@]
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include "rpc_binding.h"
|
#include "rpc_binding.h"
|
||||||
#include "rpc_message.h"
|
#include "rpc_message.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
LPSTR RPCRT4_strndupA(LPCSTR src, INT slen)
|
LPSTR RPCRT4_strndupA(LPCSTR src, INT slen)
|
||||||
{
|
{
|
||||||
|
@ -462,7 +462,7 @@ RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection,
|
||||||
RPCRT4_DestroyConnection(Binding->FromConn);
|
RPCRT4_DestroyConnection(Binding->FromConn);
|
||||||
Binding->FromConn = NULL;
|
Binding->FromConn = NULL;
|
||||||
} else {
|
} else {
|
||||||
/* we already have an connection with acceptable binding, so use it */
|
/* we already have a connection with acceptable binding, so use it */
|
||||||
if (Binding->FromConn) {
|
if (Binding->FromConn) {
|
||||||
*Connection = Binding->FromConn;
|
*Connection = Binding->FromConn;
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
|
@ -1118,9 +1118,38 @@ RPC_STATUS WINAPI RpcNetworkIsProtseqValidW(LPWSTR protseq) {
|
||||||
* RETURNS
|
* RETURNS
|
||||||
* Success: RPS_S_OK.
|
* Success: RPS_S_OK.
|
||||||
* Failure: RPC_STATUS value.
|
* Failure: RPC_STATUS value.
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
*
|
||||||
|
* If BindingHandle is NULL then the function impersonates the client
|
||||||
|
* connected to the binding handle of the current thread.
|
||||||
*/
|
*/
|
||||||
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
|
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
|
||||||
{
|
{
|
||||||
FIXME("(%p): stub\n", BindingHandle);
|
FIXME("(%p): stub\n", BindingHandle);
|
||||||
return RPC_S_NO_CONTEXT_AVAILABLE;
|
return RPC_S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RpcRevertToSelfEx (RPCRT4.@)
|
||||||
|
*
|
||||||
|
* Stops impersonating the client connected to the binding handle so that security
|
||||||
|
* checks are no longer done in the context of the client.
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* BindingHandle [I] Handle to the binding to the client.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: RPS_S_OK.
|
||||||
|
* Failure: RPC_STATUS value.
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
*
|
||||||
|
* If BindingHandle is NULL then the function stops impersonating the client
|
||||||
|
* connected to the binding handle of the current thread.
|
||||||
|
*/
|
||||||
|
RPC_STATUS WINAPI RpcRevertToSelfEx(RPC_BINDING_HANDLE BindingHandle)
|
||||||
|
{
|
||||||
|
FIXME("(%p): stub\n", BindingHandle);
|
||||||
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
#include "rpc_misc.h"
|
#include "rpc_misc.h"
|
||||||
#include "rpc_defs.h"
|
#include "rpc_defs.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
DWORD RPCRT4_GetHeaderSize(RpcPktHdr *Header)
|
DWORD RPCRT4_GetHeaderSize(RpcPktHdr *Header)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
|
|
||||||
#define MAX_THREADS 128
|
#define MAX_THREADS 128
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
typedef struct _RpcPacket
|
typedef struct _RpcPacket
|
||||||
{
|
{
|
||||||
|
@ -91,8 +91,12 @@ static CRITICAL_SECTION_DEBUG listen_cs_debug =
|
||||||
};
|
};
|
||||||
static CRITICAL_SECTION listen_cs = { &listen_cs_debug, -1, 0, 0, 0, 0 };
|
static CRITICAL_SECTION listen_cs = { &listen_cs_debug, -1, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
/* whether the server is currently listening */
|
||||||
static BOOL std_listen;
|
static BOOL std_listen;
|
||||||
static LONG listen_count = -1;
|
/* number of manual listeners (calls to RpcServerListen) */
|
||||||
|
static LONG manual_listen_count;
|
||||||
|
/* total listeners including auto listeners */
|
||||||
|
static LONG listen_count;
|
||||||
/* set on change of configuration (e.g. listening on new protseq) */
|
/* set on change of configuration (e.g. listening on new protseq) */
|
||||||
static HANDLE mgr_event;
|
static HANDLE mgr_event;
|
||||||
/* mutex for ensuring only one thread can change state at a time */
|
/* mutex for ensuring only one thread can change state at a time */
|
||||||
|
@ -156,7 +160,7 @@ static RpcServerInterface* RPCRT4_find_interface(UUID* object,
|
||||||
while (cif) {
|
while (cif) {
|
||||||
if (!memcmp(if_id, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER)) &&
|
if (!memcmp(if_id, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER)) &&
|
||||||
(check_object == FALSE || UuidEqual(MgrType, &cif->MgrTypeUuid, &status)) &&
|
(check_object == FALSE || UuidEqual(MgrType, &cif->MgrTypeUuid, &status)) &&
|
||||||
(std_listen || (cif->Flags & RPC_IF_AUTOLISTEN))) break;
|
std_listen) break;
|
||||||
cif = cif->Next;
|
cif = cif->Next;
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&server_cs);
|
LeaveCriticalSection(&server_cs);
|
||||||
|
@ -583,38 +587,45 @@ static void RPCRT4_sync_with_server_thread(void)
|
||||||
ReleaseMutex(mgr_mutex);
|
ReleaseMutex(mgr_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RPCRT4_start_listen(void)
|
static void RPCRT4_start_listen(BOOL auto_listen)
|
||||||
{
|
{
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
EnterCriticalSection(&listen_cs);
|
EnterCriticalSection(&listen_cs);
|
||||||
if (! ++listen_count) {
|
if (auto_listen || (manual_listen_count++ == 0))
|
||||||
if (!mgr_mutex) mgr_mutex = CreateMutexW(NULL, FALSE, NULL);
|
{
|
||||||
if (!mgr_event) mgr_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
if (++listen_count == 1) {
|
||||||
if (!server_ready_event) server_ready_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
/* first listener creates server thread */
|
||||||
if (!server_sem) server_sem = CreateSemaphoreW(NULL, 0, MAX_THREADS, NULL);
|
if (!mgr_mutex) mgr_mutex = CreateMutexW(NULL, FALSE, NULL);
|
||||||
if (!worker_tls) worker_tls = TlsAlloc();
|
if (!mgr_event) mgr_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
std_listen = TRUE;
|
if (!server_ready_event) server_ready_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL);
|
if (!server_sem) server_sem = CreateSemaphoreW(NULL, 0, MAX_THREADS, NULL);
|
||||||
LeaveCriticalSection(&listen_cs);
|
if (!worker_tls) worker_tls = TlsAlloc();
|
||||||
} else {
|
std_listen = TRUE;
|
||||||
LeaveCriticalSection(&listen_cs);
|
server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL);
|
||||||
RPCRT4_sync_with_server_thread();
|
} else {
|
||||||
|
LeaveCriticalSection(&listen_cs);
|
||||||
|
RPCRT4_sync_with_server_thread();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection(&listen_cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RPCRT4_stop_listen(void)
|
static void RPCRT4_stop_listen(BOOL auto_listen)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&listen_cs);
|
EnterCriticalSection(&listen_cs);
|
||||||
if (listen_count == -1)
|
if (auto_listen || (--manual_listen_count == 0))
|
||||||
LeaveCriticalSection(&listen_cs);
|
{
|
||||||
else if (--listen_count == -1) {
|
if (listen_count != 0 && --listen_count == 0) {
|
||||||
std_listen = FALSE;
|
std_listen = FALSE;
|
||||||
LeaveCriticalSection(&listen_cs);
|
LeaveCriticalSection(&listen_cs);
|
||||||
RPCRT4_sync_with_server_thread();
|
RPCRT4_sync_with_server_thread();
|
||||||
} else
|
return;
|
||||||
LeaveCriticalSection(&listen_cs);
|
}
|
||||||
assert(listen_count > -2);
|
assert(listen_count >= 0);
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&listen_cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPC_STATUS RPCRT4_use_protseq(RpcServerProtseq* ps)
|
static RPC_STATUS RPCRT4_use_protseq(RpcServerProtseq* ps)
|
||||||
|
@ -847,7 +858,7 @@ RPC_STATUS WINAPI RpcServerRegisterIf2( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid,
|
||||||
|
|
||||||
if (sif->Flags & RPC_IF_AUTOLISTEN) {
|
if (sif->Flags & RPC_IF_AUTOLISTEN) {
|
||||||
/* well, start listening, I think... */
|
/* well, start listening, I think... */
|
||||||
RPCRT4_start_listen();
|
RPCRT4_start_listen(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
|
@ -978,7 +989,7 @@ RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT
|
||||||
return RPC_S_ALREADY_LISTENING;
|
return RPC_S_ALREADY_LISTENING;
|
||||||
}
|
}
|
||||||
|
|
||||||
RPCRT4_start_listen();
|
RPCRT4_start_listen(FALSE);
|
||||||
|
|
||||||
LeaveCriticalSection(&listen_cs);
|
LeaveCriticalSection(&listen_cs);
|
||||||
|
|
||||||
|
@ -1029,11 +1040,7 @@ RPC_STATUS WINAPI RpcMgmtStopServerListening ( RPC_BINDING_HANDLE Binding )
|
||||||
return RPC_S_WRONG_KIND_OF_BINDING;
|
return RPC_S_WRONG_KIND_OF_BINDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hmm... */
|
RPCRT4_stop_listen(FALSE);
|
||||||
EnterCriticalSection(&listen_cs);
|
|
||||||
while (std_listen)
|
|
||||||
RPCRT4_stop_listen();
|
|
||||||
LeaveCriticalSection(&listen_cs);
|
|
||||||
|
|
||||||
return RPC_S_OK;
|
return RPC_S_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@
|
||||||
@ stdcall RpcRaiseException(long)
|
@ stdcall RpcRaiseException(long)
|
||||||
@ stub RpcRegisterAsyncInfo
|
@ stub RpcRegisterAsyncInfo
|
||||||
@ stub RpcRevertToSelf
|
@ stub RpcRevertToSelf
|
||||||
@ stub RpcRevertToSelfEx
|
@ stdcall RpcRevertToSelfEx(ptr)
|
||||||
@ stdcall RpcServerInqBindings(ptr)
|
@ stdcall RpcServerInqBindings(ptr)
|
||||||
@ stub RpcServerInqCallAttributesA # wxp
|
@ stub RpcServerInqCallAttributesA # wxp
|
||||||
@ stub RpcServerInqCallAttributesW # wxp
|
@ stub RpcServerInqCallAttributesW # wxp
|
||||||
|
|
|
@ -114,7 +114,7 @@
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(rpc);
|
||||||
|
|
||||||
static UUID uuid_nil;
|
static UUID uuid_nil;
|
||||||
static HANDLE master_mutex;
|
static HANDLE master_mutex;
|
||||||
|
@ -328,11 +328,11 @@ static RPC_STATUS RPC_UuidGetNodeAddress(BYTE *address)
|
||||||
DWORD status = RPC_S_OK;
|
DWORD status = RPC_S_OK;
|
||||||
|
|
||||||
ULONG buflen = sizeof(IP_ADAPTER_INFO);
|
ULONG buflen = sizeof(IP_ADAPTER_INFO);
|
||||||
PIP_ADAPTER_INFO adapter = (PIP_ADAPTER_INFO)HeapAlloc(GetProcessHeap(), 0, buflen);
|
PIP_ADAPTER_INFO adapter = HeapAlloc(GetProcessHeap(), 0, buflen);
|
||||||
|
|
||||||
if (GetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) {
|
if (GetAdaptersInfo(adapter, &buflen) == ERROR_BUFFER_OVERFLOW) {
|
||||||
HeapFree(GetProcessHeap(), 0, adapter);
|
HeapFree(GetProcessHeap(), 0, adapter);
|
||||||
adapter = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, buflen);
|
adapter = HeapAlloc(GetProcessHeap(), 0, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAdaptersInfo(adapter, &buflen) == NO_ERROR) {
|
if (GetAdaptersInfo(adapter, &buflen) == NO_ERROR) {
|
||||||
|
@ -347,7 +347,7 @@ static RPC_STATUS RPC_UuidGetNodeAddress(BYTE *address)
|
||||||
address[i] = rand() & 0xff;
|
address[i] = rand() & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
address[0] |= 0x80;
|
address[0] |= 0x01;
|
||||||
status = RPC_S_UUID_LOCAL_ONLY;
|
status = RPC_S_UUID_LOCAL_ONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue