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