From: Wouter Wijngaards Date: Tue, 1 Nov 2011 10:18:56 +0000 (+0000) Subject: fix tests, the ssl upstream setting is per-query (inside outside_network.c). X-Git-Tag: release-1.4.14rc1~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a0b040403fe8956ea730f96f3bb630799062c50;p=thirdparty%2Funbound.git fix tests, the ssl upstream setting is per-query (inside outside_network.c). git-svn-id: file:///svn/unbound/trunk@2535 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/worker.c b/daemon/worker.c index 8121f86e5..64dc085df 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -1255,7 +1255,7 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype, e->qstate = q; e->qsent = outnet_serviced_query(worker->back, qname, qnamelen, qtype, qclass, flags, dnssec, want_dnssec, - q->env->cfg->tcp_upstream || q->env->cfg->ssl_upstream, addr, + q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr, addrlen, zone, zonelen, worker_handle_service_reply, e, worker->back->udp_buff, &outbound_entry_compare); if(!e->qsent) { diff --git a/libunbound/libworker.c b/libunbound/libworker.c index 4a90451e4..707a83346 100644 --- a/libunbound/libworker.c +++ b/libunbound/libworker.c @@ -704,7 +704,7 @@ struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen, e->qstate = q; e->qsent = outnet_serviced_query(w->back, qname, qnamelen, qtype, qclass, flags, dnssec, want_dnssec, - q->env->cfg->tcp_upstream || q->env->cfg->ssl_upstream, addr, + q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr, addrlen, zone, zonelen, libworker_handle_service_reply, e, w->back->udp_buff, &outbound_entry_compare); if(!e->qsent) { diff --git a/services/outside_network.c b/services/outside_network.c index 3366b9ed6..fea386f31 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -238,7 +238,7 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len) return 0; } } - if(w->outnet->sslctx) { + if(w->outnet->sslctx && w->ssl_upstream) { pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s); if(!pend->c->ssl) { pend->c->fd = s; @@ -1075,7 +1075,7 @@ outnet_tcptimer(void* arg) struct waiting_tcp* pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet, struct sockaddr_storage* addr, socklen_t addrlen, int timeout, - comm_point_callback_t* callback, void* callback_arg) + comm_point_callback_t* callback, void* callback_arg, int ssl_upstream) { struct pending_tcp* pend = outnet->tcp_free; struct waiting_tcp* w; @@ -1100,6 +1100,7 @@ pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet, w->outnet = outnet; w->cb = callback; w->cb_arg = callback_arg; + w->ssl_upstream = ssl_upstream; #ifndef S_SPLINT_S tv.tv_sec = timeout; tv.tv_usec = 0; @@ -1163,8 +1164,9 @@ lookup_serviced(struct outside_network* outnet, ldns_buffer* buff, int dnssec, /** Create new serviced entry */ static struct serviced_query* serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec, - int want_dnssec, int tcp_upstream, struct sockaddr_storage* addr, - socklen_t addrlen, uint8_t* zone, size_t zonelen) + int want_dnssec, int tcp_upstream, int ssl_upstream, + struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone, + size_t zonelen) { struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq)); #ifdef UNBOUND_DEBUG @@ -1189,6 +1191,7 @@ serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec, sq->dnssec = dnssec; sq->want_dnssec = want_dnssec; sq->tcp_upstream = tcp_upstream; + sq->ssl_upstream = ssl_upstream; memcpy(&sq->addr, addr, addrlen); sq->addrlen = addrlen; sq->outnet = outnet; @@ -1549,7 +1552,7 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, log_err("Out of memory caching no edns for host"); sq->status = serviced_query_TCP; } - if(sq->tcp_upstream) { + if(sq->tcp_upstream || sq->ssl_upstream) { struct timeval now = *sq->outnet->now_tv; if(now.tv_sec > sq->last_sent_time.tv_sec || (now.tv_sec == sq->last_sent_time.tv_sec && @@ -1587,7 +1590,7 @@ serviced_tcp_initiate(struct outside_network* outnet, sq->last_sent_time = *sq->outnet->now_tv; sq->pending = pending_tcp_query(outnet, buff, &sq->addr, sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback, - sq); + sq, sq->ssl_upstream); if(!sq->pending) { /* delete from tree so that a retry by above layer does not * clash with this entry */ @@ -1613,7 +1616,7 @@ serviced_tcp_send(struct serviced_query* sq, ldns_buffer* buff) sq->last_sent_time = *sq->outnet->now_tv; sq->pending = pending_tcp_query(sq->outnet, buff, &sq->addr, sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback, - sq); + sq, sq->ssl_upstream); return sq->pending != NULL; } @@ -1783,9 +1786,9 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream, - struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone, - size_t zonelen, comm_point_callback_t* callback, void* callback_arg, - ldns_buffer* buff, int (*arg_compare)(void*,void*)) + int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen, + uint8_t* zone, size_t zonelen, comm_point_callback_t* callback, + void* callback_arg, ldns_buffer* buff, int (*arg_compare)(void*,void*)) { struct serviced_query* sq; struct service_callback* cb; @@ -1802,13 +1805,14 @@ outnet_serviced_query(struct outside_network* outnet, if(!sq) { /* make new serviced query entry */ sq = serviced_create(outnet, buff, dnssec, want_dnssec, - tcp_upstream, addr, addrlen, zone, zonelen); + tcp_upstream, ssl_upstream, addr, addrlen, zone, + zonelen); if(!sq) { free(cb); return NULL; } /* perform first network action */ - if(outnet->do_udp && !tcp_upstream) { + if(outnet->do_udp && !(tcp_upstream || ssl_upstream)) { if(!serviced_udp_send(sq, buff)) { (void)rbtree_delete(outnet->serviced, sq); free(sq->qbuf); diff --git a/services/outside_network.h b/services/outside_network.h index bc8d7e0f2..bfaab459e 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -262,6 +262,8 @@ struct waiting_tcp { comm_point_callback_t* cb; /** callback user argument */ void* cb_arg; + /** if it uses ssl upstream */ + int ssl_upstream; }; /** @@ -300,8 +302,8 @@ struct serviced_query { int dnssec; /** We want signatures, or else the answer is likely useless */ int want_dnssec; - /** tcp upstream used, use tcp */ - int tcp_upstream; + /** tcp upstream used, use tcp, or ssl_upstream for SSL */ + int tcp_upstream, ssl_upstream; /** where to send it */ struct sockaddr_storage addr; /** length of addr field in use. */ @@ -423,12 +425,13 @@ struct pending* pending_udp_query(struct outside_network* outnet, * without any query been sent to the server yet. * @param callback: function to call on error, timeout or reply. * @param callback_arg: user argument for callback function. + * @param ssl_upstream: if the tcp connection must use SSL. * @return: false on error for malloc or socket. Else the pending TCP object. */ struct waiting_tcp* pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet, struct sockaddr_storage* addr, socklen_t addrlen, int timeout, comm_point_callback_t* callback, - void* callback_arg); + void* callback_arg, int ssl_upstream); /** * Delete pending answer. @@ -453,6 +456,7 @@ void pending_delete(struct outside_network* outnet, struct pending* p); * @param want_dnssec: signatures are needed, without EDNS the answer is * likely to be useless. * @param tcp_upstream: use TCP for upstream queries. + * @param ssl_upstream: use SSL for upstream queries. * @param callback: callback function. * @param callback_arg: user argument to callback function. * @param addr: to which server to send the query. @@ -470,9 +474,10 @@ void pending_delete(struct outside_network* outnet, struct pending* p); struct serviced_query* outnet_serviced_query(struct outside_network* outnet, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream, - struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone, - size_t zonelen, comm_point_callback_t* callback, void* callback_arg, - ldns_buffer* buff, int (*arg_compare)(void*,void*)); + int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen, + uint8_t* zone, size_t zonelen, comm_point_callback_t* callback, + void* callback_arg, ldns_buffer* buff, + int (*arg_compare)(void*,void*)); /** * Remove service query callback. diff --git a/testcode/fake_event.c b/testcode/fake_event.c index 7abcafa3d..c6d0ad3fe 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -962,7 +962,8 @@ pending_udp_query(struct outside_network* outnet, ldns_buffer* packet, struct waiting_tcp* pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet, struct sockaddr_storage* addr, socklen_t addrlen, int timeout, - comm_point_callback_t* callback, void* callback_arg) + comm_point_callback_t* callback, void* callback_arg, + int ATTR_UNUSED(ssl_upstream)) { struct replay_runtime* runtime = (struct replay_runtime*)outnet->base; struct fake_pending* pend = (struct fake_pending*)calloc(1, @@ -1014,10 +1015,11 @@ pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet, struct serviced_query* outnet_serviced_query(struct outside_network* outnet, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec), - int ATTR_UNUSED(tcp_upstream), struct sockaddr_storage* addr, - socklen_t addrlen, uint8_t* zone, size_t ATTR_UNUSED(zonelen), - comm_point_callback_t* callback, void* callback_arg, - ldns_buffer* ATTR_UNUSED(buff), int (*arg_compare)(void*,void*)) + int ATTR_UNUSED(tcp_upstream), int ATTR_UNUSED(ssl_upstream), + struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone, + size_t ATTR_UNUSED(zonelen), comm_point_callback_t* callback, + void* callback_arg, ldns_buffer* ATTR_UNUSED(buff), + int (*arg_compare)(void*,void*)) { struct replay_runtime* runtime = (struct replay_runtime*)outnet->base; struct fake_pending* pend = (struct fake_pending*)calloc(1,