diff options
author | Marc Hoersken <info@marc-hoersken.de> | 2012-09-09 12:36:54 +0200 |
---|---|---|
committer | Marc Hoersken <info@marc-hoersken.de> | 2012-09-09 12:36:54 +0200 |
commit | 160312d9456763b36efbabf8a911e0185539f0e6 (patch) | |
tree | 311c3ab191f65651bdcb354e2a987cf04e4e059f /lib | |
parent | badb81769a32c263e4a1d4d161688bb67fbf940d (diff) |
curl_schannel.c: Reference count the credential/session handle
Reference counting the credential handle should avoid that such a
handle is freed while it is still required for connection shutdown
Diffstat (limited to 'lib')
-rw-r--r-- | lib/curl_schannel.c | 20 | ||||
-rw-r--r-- | lib/urldata.h | 1 |
2 files changed, 18 insertions, 3 deletions
diff --git a/lib/curl_schannel.c b/lib/curl_schannel.c index c050315c5..8ae1131df 100644 --- a/lib/curl_schannel.c +++ b/lib/curl_schannel.c @@ -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) { @@ -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"); } } @@ -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; @@ -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 */ @@ -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); } diff --git a/lib/urldata.h b/lib/urldata.h index fddfc0d05..5f893c92e 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -234,6 +234,7 @@ enum protection_level { struct curl_schannel_cred { CredHandle cred_handle; TimeStamp time_stamp; + int refcount; }; struct curl_schannel_ctxt { |