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