mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-09-05 17:37:42 +02:00
Merge branch 'master' into doh
This commit is contained in:
+23
-92
@@ -372,11 +372,7 @@ service_send(struct ringbuf* ring, struct timeval* now, sldns_buffer* pkt,
|
||||
sldns_buffer_limit(pkt), 0,
|
||||
(struct sockaddr*)srv_addr, srv_len);
|
||||
if(sent == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
log_err("sendto: %s", strerror(errno));
|
||||
#else
|
||||
log_err("sendto: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("sendto: %s", sock_strerror(errno));
|
||||
} else if(sent != (ssize_t)sldns_buffer_limit(pkt)) {
|
||||
log_err("sendto: partial send");
|
||||
}
|
||||
@@ -398,13 +394,12 @@ do_proxy(struct proxy* p, int retsock, sldns_buffer* pkt)
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno == EAGAIN || errno == EINTR)
|
||||
return;
|
||||
log_err("recv: %s", strerror(errno));
|
||||
#else
|
||||
if(WSAGetLastError() == WSAEINPROGRESS ||
|
||||
WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
return;
|
||||
log_err("recv: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("recv: %s", sock_strerror(errno));
|
||||
return;
|
||||
}
|
||||
sldns_buffer_set_limit(pkt, (size_t)r);
|
||||
@@ -414,11 +409,7 @@ do_proxy(struct proxy* p, int retsock, sldns_buffer* pkt)
|
||||
r = sendto(retsock, (void*)sldns_buffer_begin(pkt), (size_t)r,
|
||||
0, (struct sockaddr*)&p->addr, p->addr_len);
|
||||
if(r == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
log_err("sendto: %s", strerror(errno));
|
||||
#else
|
||||
log_err("sendto: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("sendto: %s", sock_strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -469,11 +460,7 @@ find_create_proxy(struct sockaddr_storage* from, socklen_t from_len,
|
||||
if(!p) fatal_exit("out of memory");
|
||||
p->s = socket(serv_ip6?AF_INET6:AF_INET, SOCK_DGRAM, 0);
|
||||
if(p->s == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("socket: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("socket: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("socket: %s", sock_strerror(errno));
|
||||
}
|
||||
fd_set_nonblock(p->s);
|
||||
memmove(&p->addr, from, from_len);
|
||||
@@ -507,14 +494,12 @@ service_recv(int s, struct ringbuf* ring, sldns_buffer* pkt,
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno == EAGAIN || errno == EINTR)
|
||||
return;
|
||||
fatal_exit("recvfrom: %s", strerror(errno));
|
||||
#else
|
||||
if(WSAGetLastError() == WSAEWOULDBLOCK ||
|
||||
WSAGetLastError() == WSAEINPROGRESS)
|
||||
return;
|
||||
fatal_exit("recvfrom: %s",
|
||||
wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("recvfrom: %s", sock_strerror(errno));
|
||||
}
|
||||
sldns_buffer_set_limit(pkt, (size_t)len);
|
||||
/* find its proxy element */
|
||||
@@ -550,15 +535,9 @@ tcp_proxy_delete(struct tcp_proxy* p)
|
||||
free(s);
|
||||
s = sn;
|
||||
}
|
||||
#ifndef USE_WINSOCK
|
||||
close(p->client_s);
|
||||
sock_close(p->client_s);
|
||||
if(p->server_s != -1)
|
||||
close(p->server_s);
|
||||
#else
|
||||
closesocket(p->client_s);
|
||||
if(p->server_s != -1)
|
||||
closesocket(p->server_s);
|
||||
#endif
|
||||
sock_close(p->server_s);
|
||||
free(p);
|
||||
}
|
||||
|
||||
@@ -577,14 +556,13 @@ service_tcp_listen(int s, fd_set* rorig, int* max, struct tcp_proxy** proxies,
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno == EAGAIN || errno == EINTR)
|
||||
return;
|
||||
fatal_exit("accept: %s", strerror(errno));
|
||||
#else
|
||||
if(WSAGetLastError() == WSAEWOULDBLOCK ||
|
||||
WSAGetLastError() == WSAEINPROGRESS ||
|
||||
WSAGetLastError() == WSAECONNRESET)
|
||||
return;
|
||||
fatal_exit("accept: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("accept: %s", sock_strerror(errno));
|
||||
}
|
||||
p = (struct tcp_proxy*)calloc(1, sizeof(*p));
|
||||
if(!p) fatal_exit("out of memory");
|
||||
@@ -595,11 +573,7 @@ service_tcp_listen(int s, fd_set* rorig, int* max, struct tcp_proxy** proxies,
|
||||
p->server_s = socket(addr_is_ip6(srv_addr, srv_len)?AF_INET6:AF_INET,
|
||||
SOCK_STREAM, 0);
|
||||
if(p->server_s == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("tcp socket: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("tcp socket: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("tcp socket: %s", sock_strerror(errno));
|
||||
}
|
||||
fd_set_nonblock(p->client_s);
|
||||
fd_set_nonblock(p->server_s);
|
||||
@@ -607,16 +581,14 @@ service_tcp_listen(int s, fd_set* rorig, int* max, struct tcp_proxy** proxies,
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno != EINPROGRESS) {
|
||||
log_err("tcp connect: %s", strerror(errno));
|
||||
close(p->server_s);
|
||||
close(p->client_s);
|
||||
#else
|
||||
if(WSAGetLastError() != WSAEWOULDBLOCK &&
|
||||
WSAGetLastError() != WSAEINPROGRESS) {
|
||||
log_err("tcp connect: %s",
|
||||
wsa_strerror(WSAGetLastError()));
|
||||
closesocket(p->server_s);
|
||||
closesocket(p->client_s);
|
||||
#endif
|
||||
sock_close(p->server_s);
|
||||
sock_close(p->client_s);
|
||||
free(p);
|
||||
return;
|
||||
}
|
||||
@@ -650,13 +622,12 @@ tcp_relay_read(int s, struct tcp_send_list** first,
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno == EINTR || errno == EAGAIN)
|
||||
return 1;
|
||||
log_err("tcp read: %s", strerror(errno));
|
||||
#else
|
||||
if(WSAGetLastError() == WSAEINPROGRESS ||
|
||||
WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
return 1;
|
||||
log_err("tcp read: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("tcp read: %s", sock_strerror(errno));
|
||||
return 0;
|
||||
} else if(r == 0) {
|
||||
/* connection closed */
|
||||
@@ -708,14 +679,12 @@ tcp_relay_write(int s, struct tcp_send_list** first,
|
||||
#ifndef USE_WINSOCK
|
||||
if(errno == EAGAIN || errno == EINTR)
|
||||
return 1;
|
||||
log_err("tcp write: %s", strerror(errno));
|
||||
#else
|
||||
if(WSAGetLastError() == WSAEWOULDBLOCK ||
|
||||
WSAGetLastError() == WSAEINPROGRESS)
|
||||
return 1;
|
||||
log_err("tcp write: %s",
|
||||
wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("tcp write: %s", sock_strerror(errno));
|
||||
return 0;
|
||||
} else if(r == 0) {
|
||||
/* closed */
|
||||
@@ -769,11 +738,7 @@ service_tcp_relay(struct tcp_proxy** tcp_proxies, struct timeval* now,
|
||||
log_addr(1, "read tcp answer", &p->addr, p->addr_len);
|
||||
if(!tcp_relay_read(p->server_s, &p->answerlist,
|
||||
&p->answerlast, now, delay, pkt)) {
|
||||
#ifndef USE_WINSOCK
|
||||
close(p->server_s);
|
||||
#else
|
||||
closesocket(p->server_s);
|
||||
#endif
|
||||
sock_close(p->server_s);
|
||||
FD_CLR(FD_SET_T p->server_s, worig);
|
||||
FD_CLR(FD_SET_T p->server_s, rorig);
|
||||
p->server_s = -1;
|
||||
@@ -901,11 +866,7 @@ proxy_list_clear(struct proxy* p)
|
||||
"%u returned\n", i++, from, port, (int)p->numreuse+1,
|
||||
(unsigned)p->numwait, (unsigned)p->numsent,
|
||||
(unsigned)p->numreturn);
|
||||
#ifndef USE_WINSOCK
|
||||
close(p->s);
|
||||
#else
|
||||
closesocket(p->s);
|
||||
#endif
|
||||
sock_close(p->s);
|
||||
free(p);
|
||||
p = np;
|
||||
}
|
||||
@@ -1034,11 +995,7 @@ service(const char* bind_str, int bindport, const char* serv_str,
|
||||
/* bind UDP port */
|
||||
if((s = socket(str_is_ip6(bind_str)?AF_INET6:AF_INET,
|
||||
SOCK_DGRAM, 0)) == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("socket: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("socket: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("socket: %s", sock_strerror(errno));
|
||||
}
|
||||
i=0;
|
||||
if(bindport == 0) {
|
||||
@@ -1051,11 +1008,7 @@ service(const char* bind_str, int bindport, const char* serv_str,
|
||||
exit(1);
|
||||
}
|
||||
if(bind(s, (struct sockaddr*)&bind_addr, bind_len) == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
log_err("bind: %s", strerror(errno));
|
||||
#else
|
||||
log_err("bind: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("bind: %s", sock_strerror(errno));
|
||||
if(i--==0)
|
||||
fatal_exit("cannot bind any port");
|
||||
bindport = 1024 + ((int)arc4random())%64000;
|
||||
@@ -1065,39 +1018,22 @@ service(const char* bind_str, int bindport, const char* serv_str,
|
||||
/* and TCP port */
|
||||
if((listen_s = socket(str_is_ip6(bind_str)?AF_INET6:AF_INET,
|
||||
SOCK_STREAM, 0)) == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("tcp socket: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("tcp socket: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("tcp socket: %s", sock_strerror(errno));
|
||||
}
|
||||
#ifdef SO_REUSEADDR
|
||||
if(1) {
|
||||
int on = 1;
|
||||
if(setsockopt(listen_s, SOL_SOCKET, SO_REUSEADDR, (void*)&on,
|
||||
(socklen_t)sizeof(on)) < 0)
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("setsockopt(.. SO_REUSEADDR ..) failed: %s",
|
||||
strerror(errno));
|
||||
#else
|
||||
fatal_exit("setsockopt(.. SO_REUSEADDR ..) failed: %s",
|
||||
wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
sock_strerror(errno));
|
||||
}
|
||||
#endif
|
||||
if(bind(listen_s, (struct sockaddr*)&bind_addr, bind_len) == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("tcp bind: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("tcp bind: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("tcp bind: %s", sock_strerror(errno));
|
||||
}
|
||||
if(listen(listen_s, 5) == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("tcp listen: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("tcp listen: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("tcp listen: %s", sock_strerror(errno));
|
||||
}
|
||||
fd_set_nonblock(listen_s);
|
||||
printf("listening on port: %d\n", bindport);
|
||||
@@ -1109,13 +1045,8 @@ service(const char* bind_str, int bindport, const char* serv_str,
|
||||
|
||||
/* cleanup */
|
||||
verbose(1, "cleanup");
|
||||
#ifndef USE_WINSOCK
|
||||
close(s);
|
||||
close(listen_s);
|
||||
#else
|
||||
closesocket(s);
|
||||
closesocket(listen_s);
|
||||
#endif
|
||||
sock_close(s);
|
||||
sock_close(listen_s);
|
||||
sldns_buffer_free(pkt);
|
||||
ring_delete(ring);
|
||||
}
|
||||
|
||||
+19
-2
@@ -52,6 +52,7 @@
|
||||
#include "util/data/msgreply.h"
|
||||
#include "util/data/msgencode.h"
|
||||
#include "util/data/dname.h"
|
||||
#include "util/edns.h"
|
||||
#include "util/config_file.h"
|
||||
#include "services/listen_dnsport.h"
|
||||
#include "services/outside_network.h"
|
||||
@@ -1183,7 +1184,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||
socklen_t addrlen, uint8_t* zone, size_t zonelen,
|
||||
struct module_qstate* qstate, comm_point_callback_type* callback,
|
||||
void* callback_arg, sldns_buffer* ATTR_UNUSED(buff),
|
||||
struct module_env* ATTR_UNUSED(env))
|
||||
struct module_env* env)
|
||||
{
|
||||
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
|
||||
struct fake_pending* pend = (struct fake_pending*)calloc(1,
|
||||
@@ -1212,6 +1213,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||
sldns_buffer_flip(pend->buffer);
|
||||
if(1) {
|
||||
struct edns_data edns;
|
||||
struct edns_tag_addr* client_tag_addr;
|
||||
if(!inplace_cb_query_call(env, qinfo, flags, addr, addrlen,
|
||||
zone, zonelen, qstate, qstate->region)) {
|
||||
free(pend);
|
||||
@@ -1223,9 +1225,17 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||
edns.edns_version = EDNS_ADVERTISED_VERSION;
|
||||
edns.udp_size = EDNS_ADVERTISED_SIZE;
|
||||
edns.bits = 0;
|
||||
edns.opt_list = qstate->edns_opts_back_out;
|
||||
if(dnssec)
|
||||
edns.bits = EDNS_DO;
|
||||
if((client_tag_addr = edns_tag_addr_lookup(
|
||||
&env->edns_tags->client_tags,
|
||||
addr, addrlen))) {
|
||||
uint16_t client_tag = htons(client_tag_addr->tag_data);
|
||||
edns_opt_list_append(&qstate->edns_opts_back_out,
|
||||
LDNS_EDNS_CLIENT_TAG, 2,
|
||||
(uint8_t*)&client_tag, qstate->region);
|
||||
}
|
||||
edns.opt_list = qstate->edns_opts_back_out;
|
||||
attach_edns_record(pend->buffer, &edns);
|
||||
}
|
||||
memcpy(&pend->addr, addr, addrlen);
|
||||
@@ -1293,7 +1303,14 @@ void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
|
||||
log_info("double delete of pending serviced query");
|
||||
}
|
||||
|
||||
int resolve_interface_names(struct config_file* ATTR_UNUSED(cfg),
|
||||
char*** ATTR_UNUSED(resif), int* ATTR_UNUSED(num_resif))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct listen_port* listening_ports_open(struct config_file* ATTR_UNUSED(cfg),
|
||||
char** ATTR_UNUSED(ifs), int ATTR_UNUSED(num_ifs),
|
||||
int* ATTR_UNUSED(reuseport))
|
||||
{
|
||||
return calloc(1, 1);
|
||||
|
||||
+4
-21
@@ -233,12 +233,7 @@ perfsetup(struct perfinfo* info)
|
||||
addr_is_ip6(&info->dest, info->destlen)?
|
||||
AF_INET6:AF_INET, SOCK_DGRAM, 0);
|
||||
if(info->io[i].fd == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
fatal_exit("socket: %s", strerror(errno));
|
||||
#else
|
||||
fatal_exit("socket: %s",
|
||||
wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
fatal_exit("socket: %s", sock_strerror(errno));
|
||||
}
|
||||
if(info->io[i].fd > info->maxfd)
|
||||
info->maxfd = info->io[i].fd;
|
||||
@@ -260,11 +255,7 @@ perffree(struct perfinfo* info)
|
||||
if(!info) return;
|
||||
if(info->io) {
|
||||
for(i=0; i<info->io_num; i++) {
|
||||
#ifndef USE_WINSOCK
|
||||
close(info->io[i].fd);
|
||||
#else
|
||||
closesocket(info->io[i].fd);
|
||||
#endif
|
||||
sock_close(info->io[i].fd);
|
||||
}
|
||||
free(info->io);
|
||||
}
|
||||
@@ -285,11 +276,7 @@ perfsend(struct perfinfo* info, size_t n, struct timeval* now)
|
||||
/*log_hex("send", info->qlist_data[info->qlist_idx],
|
||||
info->qlist_len[info->qlist_idx]);*/
|
||||
if(r == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
log_err("sendto: %s", strerror(errno));
|
||||
#else
|
||||
log_err("sendto: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("sendto: %s", sock_strerror(errno));
|
||||
} else if(r != (ssize_t)info->qlist_len[info->qlist_idx]) {
|
||||
log_err("partial sendto");
|
||||
}
|
||||
@@ -309,11 +296,7 @@ perfreply(struct perfinfo* info, size_t n, struct timeval* now)
|
||||
r = recv(info->io[n].fd, (void*)sldns_buffer_begin(info->buf),
|
||||
sldns_buffer_capacity(info->buf), 0);
|
||||
if(r == -1) {
|
||||
#ifndef USE_WINSOCK
|
||||
log_err("recv: %s", strerror(errno));
|
||||
#else
|
||||
log_err("recv: %s", wsa_strerror(WSAGetLastError()));
|
||||
#endif
|
||||
log_err("recv: %s", sock_strerror(errno));
|
||||
} else {
|
||||
info->by_rcode[LDNS_RCODE_WIRE(sldns_buffer_begin(
|
||||
info->buf))]++;
|
||||
|
||||
+7
-2
@@ -26,12 +26,17 @@ cd testdata
|
||||
TPKG=../testcode/mini_tdir.sh
|
||||
#RUNLIST=`(ls -1d *.tdir|grep -v '^0[016]')`
|
||||
RUNLIST=`(ls -1d *.tdir)`
|
||||
if test "$#" = "1"; then RUNLIST="$1"; fi
|
||||
if test "$#" = "1"; then
|
||||
RUNLIST="$1";
|
||||
if echo "$RUNLIST" | grep '/$' >/dev/null; then
|
||||
RUNLIST=`echo "$RUNLIST" | sed -e 's?/$??'`
|
||||
fi
|
||||
fi
|
||||
|
||||
# fix up tdir that was edited on keyboard interrupt.
|
||||
cleanup() {
|
||||
echo cleanup
|
||||
if test -f "$t.bak"; then mv "$t.bak" "$t"; fi
|
||||
if test -f "$t.bak"; then rm -fr "${t}"; mv "$t.bak" "$t"; fi
|
||||
exit 0
|
||||
}
|
||||
trap cleanup INT
|
||||
|
||||
@@ -200,6 +200,7 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
|
||||
static void
|
||||
recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
|
||||
{
|
||||
size_t i;
|
||||
char* pktstr;
|
||||
uint16_t len;
|
||||
if(!udp) {
|
||||
@@ -270,7 +271,13 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf)
|
||||
len = (size_t)l;
|
||||
}
|
||||
printf("\nnext received packet\n");
|
||||
log_buf(0, "data", buf);
|
||||
printf("data[%d] ", (int)sldns_buffer_limit(buf));
|
||||
for(i=0; i<sldns_buffer_limit(buf); i++) {
|
||||
const char* hex = "0123456789ABCDEF";
|
||||
printf("%c%c", hex[(sldns_buffer_read_u8_at(buf, i)&0xf0)>>4],
|
||||
hex[sldns_buffer_read_u8_at(buf, i)&0x0f]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
pktstr = sldns_wire2str_pkt(sldns_buffer_begin(buf), len);
|
||||
printf("%s", pktstr);
|
||||
@@ -381,11 +388,7 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival,
|
||||
SSL_free(ssl);
|
||||
SSL_CTX_free(ctx);
|
||||
}
|
||||
#ifndef USE_WINSOCK
|
||||
close(fd);
|
||||
#else
|
||||
closesocket(fd);
|
||||
#endif
|
||||
sock_close(fd);
|
||||
sldns_buffer_free(buf);
|
||||
printf("orderly exit\n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user