diff options
| -rw-r--r-- | lib/curl_ntlm_msgs.c | 49 | ||||
| -rw-r--r-- | lib/urldata.h | 5 | 
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  | 
