Rob Shearman : secur32: Fix the wrapper InitializeSecurityContextA/ W functions to handle phContext and phNewContext parameters being optional for some SSPs .

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 25 14:43:38 CDT 2007


Module: wine
Branch: master
Commit: ee47c5a23a83516c0e1734f2dfcc0f0c8729f838
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ee47c5a23a83516c0e1734f2dfcc0f0c8729f838

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu May 24 20:01:21 2007 +0100

secur32: Fix the wrapper InitializeSecurityContextA/W functions to handle phContext and phNewContext parameters being optional for some SSPs.

---

 dlls/secur32/wrapper.c |  116 ++++++++++++++++++++++++++---------------------
 1 files changed, 64 insertions(+), 52 deletions(-)

diff --git a/dlls/secur32/wrapper.c b/dlls/secur32/wrapper.c
index 60203e2..0b2d6dd 100644
--- a/dlls/secur32/wrapper.c
+++ b/dlls/secur32/wrapper.c
@@ -247,46 +247,52 @@ SECURITY_STATUS WINAPI InitializeSecurityContextA(
  ULONG *pfContextAttr, PTimeStamp ptsExpiry)
 {
     SECURITY_STATUS ret;
+    SecurePackage *package = NULL;
+    PCredHandle cred = NULL;
+    PCredHandle ctxt = NULL;
 
     TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
      debugstr_a(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
      Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
+
+    if (phContext)
+    {
+        package = (SecurePackage *)phContext->dwUpper;
+        ctxt = (PCtxtHandle)phContext->dwLower;
+    }
     if (phCredential)
     {
-        SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
-        PCredHandle cred = (PCredHandle)phCredential->dwLower;
+        package = (SecurePackage *)phCredential->dwUpper;
+        cred = (PCredHandle)phCredential->dwLower;
+    }
 
-        if (package && package->provider)
+    if (package && package->provider)
+    {
+        if (package->provider->fnTableA.InitializeSecurityContextA)
         {
-            if (package->provider->fnTableA.InitializeSecurityContextA)
-            {
-                CtxtHandle myCtxt;
+            CtxtHandle myCtxt;
 
-                if(phContext)
-                {
-                    PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
-                    myCtxt.dwUpper = realCtxt->dwUpper;
-                    myCtxt.dwLower = realCtxt->dwLower;
-                }
+            if (phContext)
+            {
+                PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
+                myCtxt.dwUpper = realCtxt->dwUpper;
+                myCtxt.dwLower = realCtxt->dwLower;
+            }
 
-                ret = package->provider->fnTableA.InitializeSecurityContextA(
-                 cred, phContext ? &myCtxt : NULL, pszTargetName, fContextReq,
-                 Reserved1, TargetDataRep, pInput, Reserved2, &myCtxt,
+            ret = package->provider->fnTableA.InitializeSecurityContextA(
+                 cred, ctxt, pszTargetName, fContextReq,
+                 Reserved1, TargetDataRep, pInput, Reserved2, phNewContext ? &myCtxt : NULL,
                  pOutput, pfContextAttr, ptsExpiry);
-                if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
-                {
-                    SECURITY_STATUS ret2;
-                    ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
-                    if (ret2 != SEC_E_OK)
-                        package->provider->fnTableW.DeleteSecurityContext(
-                         &myCtxt);
-                }
+            if ((ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED) && phNewContext)
+            {
+                SECURITY_STATUS ret2;
+                ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
+                if (ret2 != SEC_E_OK)
+                    package->provider->fnTableA.DeleteSecurityContext(&myCtxt);
             }
-            else
-                ret = SEC_E_UNSUPPORTED_FUNCTION;
         }
         else
-            ret = SEC_E_INVALID_HANDLE;
+            ret = SEC_E_UNSUPPORTED_FUNCTION;
     }
     else
         ret = SEC_E_INVALID_HANDLE;
@@ -304,46 +310,52 @@ SECURITY_STATUS WINAPI InitializeSecurityContextW(
  ULONG *pfContextAttr, PTimeStamp ptsExpiry)
 {
     SECURITY_STATUS ret;
+    SecurePackage *package = NULL;
+    PCredHandle cred = NULL;
+    PCredHandle ctxt = NULL;
 
     TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext,
      debugstr_w(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
      Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry);
+
+    if (phContext)
+    {
+        package = (SecurePackage *)phContext->dwUpper;
+        ctxt = (PCtxtHandle)phContext->dwLower;
+    }
     if (phCredential)
     {
-        SecurePackage *package = (SecurePackage *)phCredential->dwUpper;
-        PCredHandle cred = (PCredHandle)phCredential->dwLower;
+        package = (SecurePackage *)phCredential->dwUpper;
+        cred = (PCredHandle)phCredential->dwLower;
+    }
 
-        if (package && package->provider)
+    if (package && package->provider)
+    {
+        if (package->provider->fnTableW.InitializeSecurityContextW)
         {
-            if (package->provider->fnTableW.QueryCredentialsAttributesW)
-            {
-                CtxtHandle myCtxt;
+            CtxtHandle myCtxt;
 
-                if(phContext)
-                {
-                    PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
-                    myCtxt.dwUpper = realCtxt->dwUpper;
-                    myCtxt.dwLower = realCtxt->dwLower;
-                }
+            if (phContext)
+            {
+                PCtxtHandle realCtxt = (PCtxtHandle)phContext->dwLower;
+                myCtxt.dwUpper = realCtxt->dwUpper;
+                myCtxt.dwLower = realCtxt->dwLower;
+            }
 
-                ret = package->provider->fnTableW.InitializeSecurityContextW(
-                 cred, phContext ? &myCtxt : NULL, pszTargetName, fContextReq,
-                 Reserved1, TargetDataRep, pInput, Reserved2, &myCtxt,
+            ret = package->provider->fnTableW.InitializeSecurityContextW(
+                 cred, ctxt, pszTargetName, fContextReq,
+                 Reserved1, TargetDataRep, pInput, Reserved2, phNewContext ? &myCtxt : NULL,
                  pOutput, pfContextAttr, ptsExpiry);
-                if (ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED)
-                {
-                    SECURITY_STATUS ret2;
-                    ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
-                    if (ret2 != SEC_E_OK)
-                        package->provider->fnTableW.DeleteSecurityContext(
-                         &myCtxt);
-                }
+            if ((ret == SEC_E_OK || ret == SEC_I_CONTINUE_NEEDED) && phNewContext)
+            {
+                SECURITY_STATUS ret2;
+                ret2 = SECUR32_makeSecHandle(phNewContext, package, &myCtxt);
+                if (ret2 != SEC_E_OK)
+                    package->provider->fnTableW.DeleteSecurityContext(&myCtxt);
             }
-            else
-                ret = SEC_E_UNSUPPORTED_FUNCTION;
         }
         else
-            ret = SEC_E_INVALID_HANDLE;
+            ret = SEC_E_UNSUPPORTED_FUNCTION;
     }
     else
         ret = SEC_E_INVALID_HANDLE;




More information about the wine-cvs mailing list