Skip to content

Commit

Permalink
curl_schannel.c: Reference count the credential/session handle
Browse files Browse the repository at this point in the history
Reference counting the credential handle should avoid that such a
handle is freed while it is still required for connection shutdown
  • Loading branch information
mback2k committed Sep 9, 2012
1 parent badb817 commit 160312d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
20 changes: 17 additions & 3 deletions lib/curl_schannel.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,13 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}

/* increment the reference counter of the credential/session handle */
if(connssl->cred && connssl->ctxt) {
connssl->cred->refcount++;
infof(data, "schannel: incremented credential handle refcount = %d\n",
connssl->cred->refcount);
}

/* save the current session data for possible re-use */
incache = !(Curl_ssl_getsessionid(conn, (void**)&old_cred, NULL));
if(incache) {
Expand All @@ -526,7 +533,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
return retcode;
}
else {
infof(data, "schannel: stored crendential handle\n");
infof(data, "schannel: stored credential handle in session cache\n");
}
}

Expand Down Expand Up @@ -1063,7 +1070,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
conn->host.name, conn->remote_port);

if(connssl->ctxt) {
if(connssl->cred && connssl->ctxt) {
SecBufferDesc BuffDesc;
SecBuffer Buffer;
SECURITY_STATUS sspi_status;
Expand Down Expand Up @@ -1125,6 +1132,13 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle);
Curl_safefree(connssl->ctxt);
}

/* decrement the reference counter of the credential/session handle */
if(connssl->cred && connssl->cred->refcount > 0) {
connssl->cred->refcount--;
infof(data, "schannel: decremented credential handle refcount = %d\n",
connssl->cred->refcount);
}
}

/* free internal buffer for received encrypted data */
Expand All @@ -1148,7 +1162,7 @@ void Curl_schannel_session_free(void *ptr)
{
struct curl_schannel_cred *cred = ptr;

if(cred) {
if(cred && cred->refcount == 0) {
s_pSecFn->FreeCredentialsHandle(&cred->cred_handle);
Curl_safefree(cred);
}
Expand Down
1 change: 1 addition & 0 deletions lib/urldata.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ enum protection_level {
struct curl_schannel_cred {
CredHandle cred_handle;
TimeStamp time_stamp;
int refcount;
};

struct curl_schannel_ctxt {
Expand Down

0 comments on commit 160312d

Please sign in to comment.