Module: wine Branch: master Commit: ee47c5a23a83516c0e1734f2dfcc0f0c8729f838 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ee47c5a23a83516c0e1734f2df...
Author: Rob Shearman rob@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;