Rob Shearman : rpcrt4: When copying quality of service,
deep copy TransportCredentials structure too.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 24 06:18:24 CST 2007
Module: wine
Branch: master
Commit: d05f5f33a41b9336c0a2cc4ebb5dfe61f7131743
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d05f5f33a41b9336c0a2cc4ebb5dfe61f7131743
Author: Rob Shearman <rob at codeweavers.com>
Date: Wed Jan 24 00:27:10 2007 +0000
rpcrt4: When copying quality of service, deep copy TransportCredentials structure too.
Remove some no longer relevant fixmes.
---
dlls/rpcrt4/rpc_binding.c | 53 +++++++++++++++++++++++++++++++++++++++------
1 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/dlls/rpcrt4/rpc_binding.c b/dlls/rpcrt4/rpc_binding.c
index 691f378..0034907 100644
--- a/dlls/rpcrt4/rpc_binding.c
+++ b/dlls/rpcrt4/rpc_binding.c
@@ -993,12 +993,43 @@ static RPC_STATUS RpcQualityOfService_Cr
http_credentials_dst = HeapAlloc(GetProcessHeap(), 0, sizeof(*http_credentials_dst));
qos->qos->u.HttpCredentials = http_credentials_dst;
if (!http_credentials_dst) goto error;
- http_credentials_dst->TransportCredentials = http_credentials_src->TransportCredentials;
+ http_credentials_dst->TransportCredentials = NULL;
http_credentials_dst->Flags = http_credentials_src->Flags;
http_credentials_dst->AuthenticationTarget = http_credentials_src->AuthenticationTarget;
http_credentials_dst->NumberOfAuthnSchemes = http_credentials_src->NumberOfAuthnSchemes;
http_credentials_dst->AuthnSchemes = NULL;
http_credentials_dst->ServerCertificateSubject = NULL;
+ if (http_credentials_src->TransportCredentials)
+ {
+ SEC_WINNT_AUTH_IDENTITY_W *cred_dst;
+ cred_dst = http_credentials_dst->TransportCredentials = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cred_dst));
+ if (!cred_dst) goto error;
+ cred_dst->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
+ if (unicode)
+ {
+ const SEC_WINNT_AUTH_IDENTITY_W *cred_src = http_credentials_src->TransportCredentials;
+ cred_dst->UserLength = cred_src->UserLength;
+ cred_dst->PasswordLength = cred_src->PasswordLength;
+ cred_dst->DomainLength = cred_src->DomainLength;
+ cred_dst->User = RPCRT4_strndupW(cred_src->User, cred_src->UserLength);
+ cred_dst->Password = RPCRT4_strndupW(cred_src->Password, cred_src->PasswordLength);
+ cred_dst->Domain = RPCRT4_strndupW(cred_src->Domain, cred_src->DomainLength);
+ }
+ else
+ {
+ const SEC_WINNT_AUTH_IDENTITY_A *cred_src = (const SEC_WINNT_AUTH_IDENTITY_A *)http_credentials_src->TransportCredentials;
+ cred_dst->UserLength = MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->User, cred_src->UserLength, NULL, 0);
+ cred_dst->DomainLength = MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->Domain, cred_src->DomainLength, NULL, 0);
+ cred_dst->PasswordLength = MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->Password, cred_src->PasswordLength, NULL, 0);
+ cred_dst->User = HeapAlloc(GetProcessHeap(), 0, cred_dst->UserLength * sizeof(WCHAR));
+ cred_dst->Password = HeapAlloc(GetProcessHeap(), 0, cred_dst->PasswordLength * sizeof(WCHAR));
+ cred_dst->Domain = HeapAlloc(GetProcessHeap(), 0, cred_dst->DomainLength * sizeof(WCHAR));
+ if (!cred_dst || !cred_dst->Password || !cred_dst->Domain) goto error;
+ MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->User, cred_src->UserLength, cred_dst->User, cred_dst->UserLength);
+ MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->Domain, cred_src->DomainLength, cred_dst->Domain, cred_dst->DomainLength);
+ MultiByteToWideChar(CP_ACP, 0, (char *)cred_src->Password, cred_src->PasswordLength, cred_dst->Password, cred_dst->PasswordLength);
+ }
+ }
if (http_credentials_src->NumberOfAuthnSchemes)
{
http_credentials_dst->AuthnSchemes = HeapAlloc(GetProcessHeap(), 0, http_credentials_src->NumberOfAuthnSchemes * sizeof(*http_credentials_dst->AuthnSchemes));
@@ -1027,6 +1058,13 @@ error:
if (qos->qos->AdditionalSecurityInfoType == RPC_C_AUTHN_INFO_TYPE_HTTP &&
qos->qos->u.HttpCredentials)
{
+ if (qos->qos->u.HttpCredentials->TransportCredentials)
+ {
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->User);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->Domain);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->Password);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials);
+ }
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->AuthnSchemes);
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->ServerCertificateSubject);
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials);
@@ -1050,6 +1088,13 @@ ULONG RpcQualityOfService_Release(RpcQua
{
if (qos->qos->AdditionalSecurityInfoType == RPC_C_AUTHN_INFO_TYPE_HTTP)
{
+ if (qos->qos->u.HttpCredentials->TransportCredentials)
+ {
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->User);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->Domain);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials->Password);
+ HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->TransportCredentials);
+ }
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->AuthnSchemes);
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials->ServerCertificateSubject);
HeapFree(GetProcessHeap(), 0, qos->qos->u.HttpCredentials);
@@ -1205,9 +1250,6 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HA
return RPC_S_UNKNOWN_AUTHZ_SERVICE;
}
- if (SecurityQos)
- FIXME("SecurityQos ignored\n");
-
r = EnumerateSecurityPackagesA(&package_count, &packages);
if (r != SEC_E_OK)
{
@@ -1321,9 +1363,6 @@ RpcBindingSetAuthInfoExW( RPC_BINDING_HA
return RPC_S_UNKNOWN_AUTHZ_SERVICE;
}
- if (SecurityQos)
- FIXME("SecurityQos ignored\n");
-
r = EnumerateSecurityPackagesW(&package_count, &packages);
if (r != SEC_E_OK)
{
More information about the wine-cvs
mailing list