Check destruction of upstreams in correct way

This commit is contained in:
Willem Toorop 2015-07-14 11:11:06 +02:00
parent 587b320d95
commit 3c80a8a1af
1 changed files with 10 additions and 6 deletions

View File

@ -526,19 +526,22 @@ priv_getdns_upstreams_dereference(getdns_upstreams *upstreams)
{
getdns_upstream *upstream;
if (upstreams && --upstreams->referenced > 0)
if (!upstreams || --upstreams->referenced > 0)
return;
for ( upstream = upstreams->upstreams
; upstreams->count
; upstreams->count--, upstream++ ) {
if ( upstream->event.read_cb
|| upstream->event.write_cb
|| upstream->event.timeout_cb )
if (upstream->loop && ( upstream->event.read_cb
|| upstream->event.write_cb
|| upstream->event.timeout_cb) ) {
upstream->event.read_cb = NULL;
upstream->event.write_cb = NULL;
upstream->event.timeout_cb = NULL;
GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event);
}
if (upstream->tls_obj != NULL) {
SSL_shutdown(upstream->tls_obj);
SSL_free(upstream->tls_obj);
@ -550,7 +553,8 @@ priv_getdns_upstreams_dereference(getdns_upstreams *upstreams)
}
void
priv_getdns_upstream_shutdown(getdns_upstream *upstream) {
priv_getdns_upstream_shutdown(getdns_upstream *upstream)
{
/*There is a race condition with a new request being scheduled
while this happens so take ownership of the fd asap*/
int fd = upstream->fd;