mirror of
https://github.com/moparisthebest/curl
synced 2024-11-11 20:15:03 -05:00
curl_schannel.c: Fixed memory leak if connection was not successful
This commit is contained in:
parent
ee7669ba3a
commit
ae4558dbb4
@ -1063,6 +1063,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
|
|||||||
*/
|
*/
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
|
||||||
|
struct curl_schannel_cred *cached_cred = NULL;
|
||||||
|
|
||||||
infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
|
infof(data, "schannel: shutting down SSL/TLS connection with %s port %hu\n",
|
||||||
conn->host.name, conn->remote_port);
|
conn->host.name, conn->remote_port);
|
||||||
@ -1126,6 +1127,7 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
|
|||||||
|
|
||||||
/* free SSPI Schannel API security context handle */
|
/* free SSPI Schannel API security context handle */
|
||||||
if(connssl->ctxt) {
|
if(connssl->ctxt) {
|
||||||
|
infof(data, "schannel: clear security context handle\n");
|
||||||
s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle);
|
s_pSecFn->DeleteSecurityContext(&connssl->ctxt->ctxt_handle);
|
||||||
Curl_safefree(connssl->ctxt);
|
Curl_safefree(connssl->ctxt);
|
||||||
}
|
}
|
||||||
@ -1136,6 +1138,18 @@ int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
|
|||||||
infof(data, "schannel: decremented credential handle refcount = %d\n",
|
infof(data, "schannel: decremented credential handle refcount = %d\n",
|
||||||
connssl->cred->refcount);
|
connssl->cred->refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if the handle refcount is zero, check if we have not cached it */
|
||||||
|
if(connssl->cred && connssl->cred->refcount == 0) {
|
||||||
|
/* if the handle was not cached, it is stale to be freed */
|
||||||
|
if(!Curl_ssl_getsessionid(conn, (void**)&cached_cred, NULL)) {
|
||||||
|
if(connssl->cred != cached_cred) {
|
||||||
|
infof(data, "schannel: clear credential handle\n");
|
||||||
|
s_pSecFn->FreeCredentialsHandle(&connssl->cred->cred_handle);
|
||||||
|
Curl_safefree(connssl->cred);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free internal buffer for received encrypted data */
|
/* free internal buffer for received encrypted data */
|
||||||
|
Loading…
Reference in New Issue
Block a user