mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-24 00:29:58 -05:00
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
This commit is contained in:
parent
b8b2ce58d0
commit
9a0b040403
5 changed files with 36 additions and 25 deletions
|
|
@ -1255,7 +1255,7 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
|
||||||
e->qstate = q;
|
e->qstate = q;
|
||||||
e->qsent = outnet_serviced_query(worker->back, qname,
|
e->qsent = outnet_serviced_query(worker->back, qname,
|
||||||
qnamelen, qtype, qclass, flags, dnssec, want_dnssec,
|
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,
|
addrlen, zone, zonelen, worker_handle_service_reply, e,
|
||||||
worker->back->udp_buff, &outbound_entry_compare);
|
worker->back->udp_buff, &outbound_entry_compare);
|
||||||
if(!e->qsent) {
|
if(!e->qsent) {
|
||||||
|
|
|
||||||
|
|
@ -704,7 +704,7 @@ struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
|
||||||
e->qstate = q;
|
e->qstate = q;
|
||||||
e->qsent = outnet_serviced_query(w->back, qname,
|
e->qsent = outnet_serviced_query(w->back, qname,
|
||||||
qnamelen, qtype, qclass, flags, dnssec, want_dnssec,
|
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,
|
addrlen, zone, zonelen, libworker_handle_service_reply, e,
|
||||||
w->back->udp_buff, &outbound_entry_compare);
|
w->back->udp_buff, &outbound_entry_compare);
|
||||||
if(!e->qsent) {
|
if(!e->qsent) {
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,7 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(w->outnet->sslctx) {
|
if(w->outnet->sslctx && w->ssl_upstream) {
|
||||||
pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
|
pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
|
||||||
if(!pend->c->ssl) {
|
if(!pend->c->ssl) {
|
||||||
pend->c->fd = s;
|
pend->c->fd = s;
|
||||||
|
|
@ -1075,7 +1075,7 @@ outnet_tcptimer(void* arg)
|
||||||
struct waiting_tcp*
|
struct waiting_tcp*
|
||||||
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
|
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen, int timeout,
|
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 pending_tcp* pend = outnet->tcp_free;
|
||||||
struct waiting_tcp* w;
|
struct waiting_tcp* w;
|
||||||
|
|
@ -1100,6 +1100,7 @@ pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
|
||||||
w->outnet = outnet;
|
w->outnet = outnet;
|
||||||
w->cb = callback;
|
w->cb = callback;
|
||||||
w->cb_arg = callback_arg;
|
w->cb_arg = callback_arg;
|
||||||
|
w->ssl_upstream = ssl_upstream;
|
||||||
#ifndef S_SPLINT_S
|
#ifndef S_SPLINT_S
|
||||||
tv.tv_sec = timeout;
|
tv.tv_sec = timeout;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
@ -1163,8 +1164,9 @@ lookup_serviced(struct outside_network* outnet, ldns_buffer* buff, int dnssec,
|
||||||
/** Create new serviced entry */
|
/** Create new serviced entry */
|
||||||
static struct serviced_query*
|
static struct serviced_query*
|
||||||
serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec,
|
serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec,
|
||||||
int want_dnssec, int tcp_upstream, struct sockaddr_storage* addr,
|
int want_dnssec, int tcp_upstream, int ssl_upstream,
|
||||||
socklen_t addrlen, uint8_t* zone, size_t zonelen)
|
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
|
||||||
|
size_t zonelen)
|
||||||
{
|
{
|
||||||
struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
|
struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
|
||||||
#ifdef UNBOUND_DEBUG
|
#ifdef UNBOUND_DEBUG
|
||||||
|
|
@ -1189,6 +1191,7 @@ serviced_create(struct outside_network* outnet, ldns_buffer* buff, int dnssec,
|
||||||
sq->dnssec = dnssec;
|
sq->dnssec = dnssec;
|
||||||
sq->want_dnssec = want_dnssec;
|
sq->want_dnssec = want_dnssec;
|
||||||
sq->tcp_upstream = tcp_upstream;
|
sq->tcp_upstream = tcp_upstream;
|
||||||
|
sq->ssl_upstream = ssl_upstream;
|
||||||
memcpy(&sq->addr, addr, addrlen);
|
memcpy(&sq->addr, addr, addrlen);
|
||||||
sq->addrlen = addrlen;
|
sq->addrlen = addrlen;
|
||||||
sq->outnet = outnet;
|
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");
|
log_err("Out of memory caching no edns for host");
|
||||||
sq->status = serviced_query_TCP;
|
sq->status = serviced_query_TCP;
|
||||||
}
|
}
|
||||||
if(sq->tcp_upstream) {
|
if(sq->tcp_upstream || sq->ssl_upstream) {
|
||||||
struct timeval now = *sq->outnet->now_tv;
|
struct timeval now = *sq->outnet->now_tv;
|
||||||
if(now.tv_sec > sq->last_sent_time.tv_sec ||
|
if(now.tv_sec > sq->last_sent_time.tv_sec ||
|
||||||
(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->last_sent_time = *sq->outnet->now_tv;
|
||||||
sq->pending = pending_tcp_query(outnet, buff, &sq->addr,
|
sq->pending = pending_tcp_query(outnet, buff, &sq->addr,
|
||||||
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
|
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
|
||||||
sq);
|
sq, sq->ssl_upstream);
|
||||||
if(!sq->pending) {
|
if(!sq->pending) {
|
||||||
/* delete from tree so that a retry by above layer does not
|
/* delete from tree so that a retry by above layer does not
|
||||||
* clash with this entry */
|
* 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->last_sent_time = *sq->outnet->now_tv;
|
||||||
sq->pending = pending_tcp_query(sq->outnet, buff, &sq->addr,
|
sq->pending = pending_tcp_query(sq->outnet, buff, &sq->addr,
|
||||||
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
|
sq->addrlen, TCP_AUTH_QUERY_TIMEOUT, serviced_tcp_callback,
|
||||||
sq);
|
sq, sq->ssl_upstream);
|
||||||
return sq->pending != NULL;
|
return sq->pending != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1783,9 +1786,9 @@ struct serviced_query*
|
||||||
outnet_serviced_query(struct outside_network* outnet,
|
outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
|
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
|
int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen,
|
||||||
size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
|
uint8_t* zone, size_t zonelen, comm_point_callback_t* callback,
|
||||||
ldns_buffer* buff, int (*arg_compare)(void*,void*))
|
void* callback_arg, ldns_buffer* buff, int (*arg_compare)(void*,void*))
|
||||||
{
|
{
|
||||||
struct serviced_query* sq;
|
struct serviced_query* sq;
|
||||||
struct service_callback* cb;
|
struct service_callback* cb;
|
||||||
|
|
@ -1802,13 +1805,14 @@ outnet_serviced_query(struct outside_network* outnet,
|
||||||
if(!sq) {
|
if(!sq) {
|
||||||
/* make new serviced query entry */
|
/* make new serviced query entry */
|
||||||
sq = serviced_create(outnet, buff, dnssec, want_dnssec,
|
sq = serviced_create(outnet, buff, dnssec, want_dnssec,
|
||||||
tcp_upstream, addr, addrlen, zone, zonelen);
|
tcp_upstream, ssl_upstream, addr, addrlen, zone,
|
||||||
|
zonelen);
|
||||||
if(!sq) {
|
if(!sq) {
|
||||||
free(cb);
|
free(cb);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* perform first network action */
|
/* perform first network action */
|
||||||
if(outnet->do_udp && !tcp_upstream) {
|
if(outnet->do_udp && !(tcp_upstream || ssl_upstream)) {
|
||||||
if(!serviced_udp_send(sq, buff)) {
|
if(!serviced_udp_send(sq, buff)) {
|
||||||
(void)rbtree_delete(outnet->serviced, sq);
|
(void)rbtree_delete(outnet->serviced, sq);
|
||||||
free(sq->qbuf);
|
free(sq->qbuf);
|
||||||
|
|
|
||||||
|
|
@ -262,6 +262,8 @@ struct waiting_tcp {
|
||||||
comm_point_callback_t* cb;
|
comm_point_callback_t* cb;
|
||||||
/** callback user argument */
|
/** callback user argument */
|
||||||
void* cb_arg;
|
void* cb_arg;
|
||||||
|
/** if it uses ssl upstream */
|
||||||
|
int ssl_upstream;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -300,8 +302,8 @@ struct serviced_query {
|
||||||
int dnssec;
|
int dnssec;
|
||||||
/** We want signatures, or else the answer is likely useless */
|
/** We want signatures, or else the answer is likely useless */
|
||||||
int want_dnssec;
|
int want_dnssec;
|
||||||
/** tcp upstream used, use tcp */
|
/** tcp upstream used, use tcp, or ssl_upstream for SSL */
|
||||||
int tcp_upstream;
|
int tcp_upstream, ssl_upstream;
|
||||||
/** where to send it */
|
/** where to send it */
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
/** length of addr field in use. */
|
/** 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.
|
* without any query been sent to the server yet.
|
||||||
* @param callback: function to call on error, timeout or reply.
|
* @param callback: function to call on error, timeout or reply.
|
||||||
* @param callback_arg: user argument for callback function.
|
* @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.
|
* @return: false on error for malloc or socket. Else the pending TCP object.
|
||||||
*/
|
*/
|
||||||
struct waiting_tcp* pending_tcp_query(struct outside_network* outnet,
|
struct waiting_tcp* pending_tcp_query(struct outside_network* outnet,
|
||||||
ldns_buffer* packet, struct sockaddr_storage* addr,
|
ldns_buffer* packet, struct sockaddr_storage* addr,
|
||||||
socklen_t addrlen, int timeout, comm_point_callback_t* callback,
|
socklen_t addrlen, int timeout, comm_point_callback_t* callback,
|
||||||
void* callback_arg);
|
void* callback_arg, int ssl_upstream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete pending answer.
|
* 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
|
* @param want_dnssec: signatures are needed, without EDNS the answer is
|
||||||
* likely to be useless.
|
* likely to be useless.
|
||||||
* @param tcp_upstream: use TCP for upstream queries.
|
* @param tcp_upstream: use TCP for upstream queries.
|
||||||
|
* @param ssl_upstream: use SSL for upstream queries.
|
||||||
* @param callback: callback function.
|
* @param callback: callback function.
|
||||||
* @param callback_arg: user argument to callback function.
|
* @param callback_arg: user argument to callback function.
|
||||||
* @param addr: to which server to send the query.
|
* @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,
|
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
|
uint16_t flags, int dnssec, int want_dnssec, int tcp_upstream,
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
|
int ssl_upstream, struct sockaddr_storage* addr, socklen_t addrlen,
|
||||||
size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
|
uint8_t* zone, size_t zonelen, comm_point_callback_t* callback,
|
||||||
ldns_buffer* buff, int (*arg_compare)(void*,void*));
|
void* callback_arg, ldns_buffer* buff,
|
||||||
|
int (*arg_compare)(void*,void*));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove service query callback.
|
* Remove service query callback.
|
||||||
|
|
|
||||||
|
|
@ -962,7 +962,8 @@ pending_udp_query(struct outside_network* outnet, ldns_buffer* packet,
|
||||||
struct waiting_tcp*
|
struct waiting_tcp*
|
||||||
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
|
pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
|
||||||
struct sockaddr_storage* addr, socklen_t addrlen, int timeout,
|
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 replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
||||||
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
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,
|
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||||
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
|
||||||
uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec),
|
uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec),
|
||||||
int ATTR_UNUSED(tcp_upstream), struct sockaddr_storage* addr,
|
int ATTR_UNUSED(tcp_upstream), int ATTR_UNUSED(ssl_upstream),
|
||||||
socklen_t addrlen, uint8_t* zone, size_t ATTR_UNUSED(zonelen),
|
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
|
||||||
comm_point_callback_t* callback, void* callback_arg,
|
size_t ATTR_UNUSED(zonelen), comm_point_callback_t* callback,
|
||||||
ldns_buffer* ATTR_UNUSED(buff), int (*arg_compare)(void*,void*))
|
void* callback_arg, ldns_buffer* ATTR_UNUSED(buff),
|
||||||
|
int (*arg_compare)(void*,void*))
|
||||||
{
|
{
|
||||||
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
||||||
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue