[RPCRT4] Sync with Wine Staging 2.2. CORE-12823

b85c2f7 rpcrt4: Fix some spec file entries.
042b41d rpcrt4: Avoid potential overflow in rpcrt4_protseq_ncacn_np_open_endpoint.
c32cd11 rpcrt4: Acquire new credential handle for each connection.
da05dfd rpcrt4: Store security package name in rpc_server_registered_auth_info.
f8450fa rpcrt4: Handle NULL binding in RpcBindingInqAuthClient{,Ex}.

svn path=/trunk/; revision=74085
This commit is contained in:
Amine Khaldi 2017-03-05 20:42:41 +00:00
parent 8832faa915
commit f2ad28ea2d
6 changed files with 35 additions and 37 deletions

View file

@ -1603,11 +1603,15 @@ RpcBindingInqAuthClientExW( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *
RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc,
ULONG *AuthzSvc, ULONG Flags )
{
RpcBinding *bind = ClientBinding;
RpcBinding *bind;
TRACE("%p %p %p %p %p %p 0x%x\n", ClientBinding, Privs, ServerPrincName, AuthnLevel,
AuthnSvc, AuthzSvc, Flags);
if (!ClientBinding) ClientBinding = I_RpcGetCurrentCallHandle();
if (!ClientBinding) return RPC_S_INVALID_BINDING;
bind = ClientBinding;
if (!bind->FromConn) return RPC_S_INVALID_BINDING;
return rpcrt4_conn_inquire_auth_client(bind->FromConn, Privs,

View file

@ -1047,7 +1047,10 @@ RPC_STATUS RPCRT4_ServerConnectionAuth(RpcConnection* conn,
auth_data_in->auth_type, cred, exp,
max_token, NULL, &conn->AuthInfo);
if (status != RPC_S_OK)
{
FreeCredentialsHandle(&cred);
return status;
}
/* FIXME: should auth_data_in->auth_context_id be checked in the !start case? */
conn->auth_context_id = auth_data_in->auth_context_id;

View file

@ -1287,12 +1287,10 @@ RPC_STATUS WINAPI RpcObjectSetType( UUID* ObjUuid, UUID* TypeUuid )
struct rpc_server_registered_auth_info
{
struct list entry;
TimeStamp exp;
BOOL cred_acquired;
CredHandle cred;
ULONG max_token;
USHORT auth_type;
WCHAR *package_name;
WCHAR *principal;
ULONG max_token;
};
static RPC_STATUS find_security_package(ULONG auth_type, SecPkgInfoW **packages_buf, SecPkgInfoW **ret)
@ -1331,36 +1329,22 @@ RPC_STATUS RPCRT4_ServerGetRegisteredAuthInfo(
{
RPC_STATUS status = RPC_S_UNKNOWN_AUTHN_SERVICE;
struct rpc_server_registered_auth_info *auth_info;
SECURITY_STATUS sec_status;
EnterCriticalSection(&server_auth_info_cs);
LIST_FOR_EACH_ENTRY(auth_info, &server_registered_auth_info, struct rpc_server_registered_auth_info, entry)
{
if (auth_info->auth_type == auth_type)
{
if (!auth_info->cred_acquired)
sec_status = AcquireCredentialsHandleW((SEC_WCHAR *)auth_info->principal, auth_info->package_name,
SECPKG_CRED_INBOUND, NULL, NULL, NULL, NULL,
cred, exp);
if (sec_status != SEC_E_OK)
{
SecPkgInfoW *packages, *package;
SECURITY_STATUS sec_status;
status = find_security_package(auth_info->auth_type, &packages, &package);
if (status != RPC_S_OK)
break;
sec_status = AcquireCredentialsHandleW((SEC_WCHAR *)auth_info->principal, package->Name,
SECPKG_CRED_INBOUND, NULL, NULL, NULL, NULL,
&auth_info->cred, &auth_info->exp);
FreeContextBuffer(packages);
if (sec_status != SEC_E_OK)
{
status = RPC_S_SEC_PKG_ERROR;
break;
}
auth_info->cred_acquired = TRUE;
status = RPC_S_SEC_PKG_ERROR;
break;
}
*cred = auth_info->cred;
*exp = auth_info->exp;
*max_token = auth_info->max_token;
status = RPC_S_OK;
break;
@ -1378,8 +1362,7 @@ void RPCRT4_ServerFreeAllRegisteredAuthInfo(void)
EnterCriticalSection(&server_auth_info_cs);
LIST_FOR_EACH_ENTRY_SAFE(auth_info, cursor2, &server_registered_auth_info, struct rpc_server_registered_auth_info, entry)
{
if (auth_info->cred_acquired)
FreeCredentialsHandle(&auth_info->cred);
HeapFree(GetProcessHeap(), 0, auth_info->package_name);
HeapFree(GetProcessHeap(), 0, auth_info->principal);
HeapFree(GetProcessHeap(), 0, auth_info);
}
@ -1415,6 +1398,7 @@ RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( RPC_WSTR ServerPrincName, ULONG Au
{
struct rpc_server_registered_auth_info *auth_info;
SecPkgInfoW *packages, *package;
WCHAR *package_name;
ULONG max_token;
RPC_STATUS status;
@ -1424,20 +1408,27 @@ RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( RPC_WSTR ServerPrincName, ULONG Au
if (status != RPC_S_OK)
return status;
package_name = RPCRT4_strdupW(package->Name);
max_token = package->cbMaxToken;
FreeContextBuffer(packages);
auth_info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*auth_info));
if (!auth_info)
if (!package_name)
return RPC_S_OUT_OF_RESOURCES;
auth_info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*auth_info));
if (!auth_info) {
HeapFree(GetProcessHeap(), 0, package_name);
return RPC_S_OUT_OF_RESOURCES;
}
if (ServerPrincName && !(auth_info->principal = RPCRT4_strdupW(ServerPrincName))) {
HeapFree(GetProcessHeap(), 0, package_name);
HeapFree(GetProcessHeap(), 0, auth_info);
return RPC_S_OUT_OF_RESOURCES;
}
auth_info->max_token = max_token;
auth_info->auth_type = AuthnSvc;
auth_info->package_name = package_name;
auth_info->max_token = max_token;
EnterCriticalSection(&server_auth_info_cs);
list_add_tail(&server_registered_auth_info, &auth_info->entry);

View file

@ -390,7 +390,7 @@ static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint(RpcServerProtseq *protse
RPC_STATUS r;
LPSTR pname;
RpcConnection *Connection;
char generated_endpoint[21];
char generated_endpoint[26];
if (!endpoint)
{

View file

@ -118,9 +118,9 @@
118 stdcall NDRSContextMarshall2(ptr ptr ptr ptr ptr long)
119 stdcall NDRSContextMarshall(ptr ptr ptr)
120 stdcall NDRSContextMarshallEx(ptr ptr ptr ptr)
121 stdcall NDRSContextUnmarshall2(ptr ptr ptr ptr long)
122 stdcall NDRSContextUnmarshall(ptr ptr)
123 stdcall NDRSContextUnmarshallEx(ptr ptr ptr)
121 stdcall NDRSContextUnmarshall2(ptr ptr long ptr long)
122 stdcall NDRSContextUnmarshall(ptr long)
123 stdcall NDRSContextUnmarshallEx(ptr ptr long)
124 stub NDRcopy
125 stdcall NdrAllocate(ptr long)
126 varargs NdrAsyncClientCall(ptr ptr)

View file

@ -160,7 +160,7 @@ reactos/dll/win32/rasapi32 # Synced to WineStaging-1.9.11
reactos/dll/win32/resutils # Synced to WineStaging-1.9.11
reactos/dll/win32/riched20 # Synced to WineStaging-1.9.23
reactos/dll/win32/riched32 # Synced to WineStaging-1.9.11
reactos/dll/win32/rpcrt4 # Synced to WineStaging-1.9.23
reactos/dll/win32/rpcrt4 # Synced to WineStaging-2.2
reactos/dll/win32/rsabase # Synced to WineStaging-1.9.11
reactos/dll/win32/rsaenh # Synced to WineStaging-1.9.11
reactos/dll/win32/sccbase # Synced to WineStaging-1.9.11