aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/http_negotiate_sspi.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/lib/http_negotiate_sspi.c b/lib/http_negotiate_sspi.c
index 6b3be317b..0658c529a 100644
--- a/lib/http_negotiate_sspi.c
+++ b/lib/http_negotiate_sspi.c
@@ -133,7 +133,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy,
(ret = get_gss_name(conn, proxy, neg_ctx->server_name)))
return ret;
- if(!neg_ctx->max_token_length) {
+ if(!neg_ctx->output_token) {
PSecPkgInfo SecurityPackage;
ret = s_pSecFn->QuerySecurityPackageInfo((SEC_CHAR *)"Negotiate",
&SecurityPackage);
@@ -153,19 +153,8 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy,
header++;
len = strlen(header);
- if(len > 0) {
- input_token = malloc(neg_ctx->max_token_length);
- if(!input_token)
- return -1;
-
- input_token_len = Curl_base64_decode(header,
- (unsigned char **)&input_token);
- if(input_token_len == 0)
- return -1;
- }
-
- if(!input_token) {
- /* first call in a new negotation, we have to require credentials,
+ if(!len) {
+ /* first call in a new negotation, we have to acquire credentials,
and allocate memory for the context */
neg_ctx->credentials = (CredHandle *)malloc(sizeof(CredHandle));
@@ -182,6 +171,16 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy,
if(neg_ctx->status != SEC_E_OK)
return -1;
}
+ else {
+ input_token = malloc(neg_ctx->max_token_length);
+ if(!input_token)
+ return -1;
+
+ input_token_len = Curl_base64_decode(header,
+ (unsigned char **)&input_token);
+ if(input_token_len == 0)
+ return -1;
+ }
/* prepare the output buffers, and input buffers if present */
out_buff_desc.ulVersion = 0;
@@ -280,6 +279,8 @@ static void cleanup(struct negotiatedata *neg_ctx)
free(neg_ctx->output_token);
neg_ctx->output_token = 0;
}
+
+ neg_ctx->max_token_length = 0;
}
void Curl_cleanup_negotiate(struct SessionHandle *data)