aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/curl_ntlm_msgs.c49
-rw-r--r--lib/urldata.h5
2 files changed, 35 insertions, 19 deletions
diff --git a/lib/curl_ntlm_msgs.c b/lib/curl_ntlm_msgs.c
index b38670fdf..99df82f87 100644
--- a/lib/curl_ntlm_msgs.c
+++ b/lib/curl_ntlm_msgs.c
@@ -343,10 +343,16 @@ void Curl_ntlm_sspi_cleanup(struct ntlmdata *ntlm)
{
Curl_safefree(ntlm->input_token);
- if(ntlm->has_handles) {
- s_pSecFn->DeleteSecurityContext(&ntlm->context);
- s_pSecFn->FreeCredentialsHandle(&ntlm->credentials);
- ntlm->has_handles = 0;
+ if(ntlm->context) {
+ s_pSecFn->DeleteSecurityContext(ntlm->context);
+ free(ntlm->context);
+ ntlm->context = NULL;
+ }
+
+ if(ntlm->credentials) {
+ s_pSecFn->FreeCredentialsHandle(ntlm->credentials);
+ free(ntlm->credentials);
+ ntlm->credentials = NULL;
}
ntlm->max_token_length = 0;
@@ -452,15 +458,29 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
/* Use the current Windows user */
ntlm->p_identity = NULL;
- /* Acquire our credientials handle */
+ /* Allocate our credentials handle */
+ ntlm->credentials = malloc(sizeof(CredHandle));
+ if(!ntlm->credentials)
+ return CURLE_OUT_OF_MEMORY;
+
+ memset(ntlm->credentials, 0, sizeof(CredHandle));
+
+ /* Acquire our credentials handle */
status = s_pSecFn->AcquireCredentialsHandle(NULL,
(TCHAR *) TEXT("NTLM"),
SECPKG_CRED_OUTBOUND, NULL,
ntlm->p_identity, NULL, NULL,
- &ntlm->credentials, &tsDummy);
+ ntlm->credentials, &tsDummy);
if(status != SEC_E_OK)
return CURLE_OUT_OF_MEMORY;
+ /* Allocate our new context handle */
+ ntlm->context = malloc(sizeof(CtxtHandle));
+ if(!ntlm->context)
+ return CURLE_OUT_OF_MEMORY;
+
+ memset(ntlm->context, 0, sizeof(CtxtHandle));
+
/* Setup the type-1 "output" security buffer */
type_1_desc.ulVersion = SECBUFFER_VERSION;
type_1_desc.cBuffers = 1;
@@ -470,22 +490,19 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
type_1_buf.cbBuffer = curlx_uztoul(ntlm->max_token_length);
/* Generate our type-1 message */
- status = s_pSecFn->InitializeSecurityContext(&ntlm->credentials, NULL,
+ status = s_pSecFn->InitializeSecurityContext(ntlm->credentials, NULL,
(TCHAR *) TEXT(""),
0, 0, SECURITY_NETWORK_DREP,
NULL, 0,
- &ntlm->context, &type_1_desc,
+ ntlm->context, &type_1_desc,
&attrs, &tsDummy);
if(status == SEC_I_COMPLETE_AND_CONTINUE ||
status == SEC_I_CONTINUE_NEEDED)
- s_pSecFn->CompleteAuthToken(&ntlm->context, &type_1_desc);
- else if(status != SEC_E_OK) {
- s_pSecFn->FreeCredentialsHandle(&ntlm->credentials);
+ s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);
+ else if(status != SEC_E_OK)
return CURLE_RECV_ERROR;
- }
- ntlm->has_handles = 1;
size = type_1_buf.cbBuffer;
#else
@@ -652,12 +669,12 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
type_3_buf.cbBuffer = curlx_uztoul(ntlm->max_token_length);
/* Generate our type-3 message */
- status = s_pSecFn->InitializeSecurityContext(&ntlm->credentials,
- &ntlm->context,
+ status = s_pSecFn->InitializeSecurityContext(ntlm->credentials,
+ ntlm->context,
(TCHAR *) TEXT(""),
0, 0, SECURITY_NETWORK_DREP,
&type_2_desc,
- 0, &ntlm->context,
+ 0, ntlm->context,
&type_3_desc,
&attrs, &tsDummy);
if(status != SEC_E_OK) {
diff --git a/lib/urldata.h b/lib/urldata.h
index 5d1366737..4146b8b72 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -435,13 +435,12 @@ struct kerberos5data {
struct ntlmdata {
curlntlm state;
#ifdef USE_WINDOWS_SSPI
- CredHandle credentials;
- CtxtHandle context;
+ CredHandle *credentials;
+ CtxtHandle *context;
SEC_WINNT_AUTH_IDENTITY identity;
SEC_WINNT_AUTH_IDENTITY *p_identity;
size_t max_token_length;
BYTE *output_token;
- int has_handles;
BYTE *input_token;
size_t input_token_len;
#else