From 4acce42720275c463eebc0416aa01f019ed39816 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Mon, 2 Oct 2017 14:15:16 +0100 Subject: [PATCH 01/59] Check for implementations of sigemptyset, sigfillset and sigaddset and add if not present. mingw64 doesn't have them and compilation fails at link time. --- configure.ac | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac index 1c1d6453..769879ae 100644 --- a/configure.ac +++ b/configure.ac @@ -699,6 +699,8 @@ AC_CHECK_TYPE([sigset_t], [ #endif ]) +AC_CHECK_FUNCS(sigemptyset sigfillset sigaddset) + my_with_libidn=1 AC_ARG_WITH(libidn, AS_HELP_STRING([--with-libidn=pathname], [path to libidn (default: search /usr/local ..)]), @@ -1544,12 +1546,26 @@ static inline int _gldns_custom_vsnprintf(char *str, size_t size, const char *fo # endif #endif +#ifdef __cplusplus +extern "C" { +#endif + #if !defined(HAVE_STRPTIME) || !defined(STRPTIME_WORKS) #define strptime unbound_strptime struct tm; char *strptime(const char *s, const char *format, struct tm *tm); #endif +#if !defined(HAVE_SIGEMPTYSET) +# define sigemptyset(pset) (*(pset) = 0) +#endif +#if !defined(HAVE_SIGFILLSET) +# define sigfillset(pset) (*(pset) = (_sigset_t)-1) +#endif +#if !defined(HAVE_SIGADDSET) +# define sigaddset(pset, num) (*(pset) |= (1L<<(num))) +#endif + #ifdef HAVE_LIBUNBOUND # include # ifdef HAVE_UNBOUND_EVENT_H @@ -1567,6 +1583,10 @@ int ub_resolve_event(struct ub_ctx* ctx, const char* name, int rrtype, # endif # endif #endif + +#ifdef __cplusplus +} +#endif ]) dnl --------------------------------------------------------------------------- From b22666d66755f9c36b7eb0a4502d6f1fd5176454 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 2 Oct 2017 16:34:12 +0200 Subject: [PATCH 02/59] Bump version --- configure.ac | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 1c1d6453..83715747 100644 --- a/configure.ac +++ b/configure.ac @@ -36,12 +36,12 @@ sinclude(./m4/acx_getaddrinfo.m4) sinclude(./m4/ax_check_compile_flag.m4) sinclude(./m4/pkg.m4) -AC_INIT([getdns], [1.2.0], [users@getdnsapi.net], [], [https://getdnsapi.net]) +AC_INIT([getdns], [1.2.1], [users@getdnsapi.net], [], [https://getdnsapi.net]) # Dont forget to put a dash in front of the release candidate!!! # That is how it is done with semantic versioning! # -AC_SUBST(RELEASE_CANDIDATE, []) +AC_SUBST(RELEASE_CANDIDATE, [rc1]) # Set current date from system if not set AC_ARG_WITH([current-date], @@ -51,7 +51,7 @@ AC_ARG_WITH([current-date], [CURRENT_DATE="`date -u +%Y-%m-%dT%H:%M:%SZ`"]) AC_SUBST(GETDNS_VERSION, ["AC_PACKAGE_VERSION$RELEASE_CANDIDATE"]) -AC_SUBST(GETDNS_NUMERIC_VERSION, [0x01020000]) +AC_SUBST(GETDNS_NUMERIC_VERSION, [0x010200C1]) AC_SUBST(API_VERSION, ["December 2015"]) AC_SUBST(API_NUMERIC_VERSION, [0x07df0c00]) GETDNS_COMPILATION_COMMENT="AC_PACKAGE_NAME $GETDNS_VERSION configured on $CURRENT_DATE for the $API_VERSION version of the API" @@ -86,9 +86,10 @@ GETDNS_COMPILATION_COMMENT="AC_PACKAGE_NAME $GETDNS_VERSION configured on $CURRE # getdns-1.1.1 had libversion 6:1:0 # getdns-1.1.2 had libversion 7:0:1 # getdns-1.1.3 had libversion 7:1:1 -# getdns-1.2.0 has libversion 8:0:2 +# getdns-1.2.0 had libversion 8:0:2 +# getdns-1.2.1 will have libversion 8:1:2 # -GETDNS_LIBVERSION=8:0:2 +GETDNS_LIBVERSION=8:1:2 AC_SUBST(GETDNS_COMPILATION_COMMENT) AC_SUBST(GETDNS_LIBVERSION) From 3e221ebed587d303c0d7ebaca02430f94a80a51b Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 2 Oct 2017 16:36:07 +0200 Subject: [PATCH 03/59] Fix parallel make install's --- ChangeLog | 4 ++++ src/Makefile.in | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e6e66951..189c3da3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +* 2017-1?-??: Version 1.2.1 + * Fix Makefile dependencies for parallel install. + Thanks ilovezfs + * 2017-09-29: Version 1.2.0 * Bugfix of rc1: authentication of first query with TLS Thanks Travis Burtrum diff --git a/src/Makefile.in b/src/Makefile.in index 02b81f40..f77b7447 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -160,7 +160,7 @@ install-headers: getdns/getdns.h getdns/getdns_extra.h uninstall-headers: rm -rf $(DESTDIR)$(includedir)/getdns -install-libs: libgetdns.la +install-libs: libgetdns.la $(EXTENSION_LIBEVENT_LIB) $(EXTENSION_LIBUV_LIB) $(EXTENSION_LIBEV_LIB) $(INSTALL) -m 755 -d $(DESTDIR)$(libdir) $(LIBTOOL) --mode=install cp libgetdns.la $(DESTDIR)$(libdir) if test $(have_libevent) = 1 ; then $(LIBTOOL) --mode=install cp $(EXTENSION_LIBEVENT_LIB) $(DESTDIR)$(libdir) ; fi From ffc72ff2537dcab85a97b370df36514deb3e5de7 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 3 Oct 2017 17:09:33 +0200 Subject: [PATCH 04/59] Rearrange includes for finding inet_ntop on Windows + make sure stubby is linked with initial LDFLAGS (i.e. static) as well --- configure.ac | 73 +++++++++++++++++++++++++++++---------------------- src/convert.c | 2 +- src/dict.c | 2 +- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/configure.ac b/configure.ac index 1552bb39..ca8c6d81 100644 --- a/configure.ac +++ b/configure.ac @@ -1147,8 +1147,8 @@ AC_SUBST(INSTALL_STUBBY) AC_SUBST(UNINSTALL_STUBBY) AC_SUBST(STUBBY_XTRA_OBJS) -STUBBY_LDFLAGS="" STUBBY_LIBS="" +STUBBY_LDFLAGS="" if test $my_with_yaml = 1 then @@ -1156,8 +1156,8 @@ then then getdns_LIBS="$LIBS" getdns_LDFLAGS="$LDFLAGS" - LIBS="" - LDFLAGS="" + LIBS="$initial_LIBS" + LDFLAGS="$initial_LDFLAGS" fi AC_ARG_WITH(libyaml, AS_HELP_STRING([--with-libyaml=pathname], [path to libyaml (default: search /usr/local ..)]), @@ -1350,7 +1350,44 @@ AH_BOTTOM([ # ifndef FD_SETSIZE # define FD_SETSIZE 1024 # endif -# define PRIsz "Iu" + +/* the version of the windows API enabled */ +# ifndef WINVER +# define WINVER 0x0600 // 0x0502 +# endif +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0600 // 0x0502 +# endif +# ifdef HAVE_WS2TCPIP_H +# include +# endif + +# ifdef _MSC_VER +# if _MSC_VER >= 1800 +# define PRIsz "zu" +# else +# define PRIsz "Iu" +# endif +# else +# define PRIsz "Iu" +# endif + +# ifdef HAVE_WINSOCK2_H +# include +# endif + +# ifndef USE_WINSOCK +# define ARG_LL "%ll" +# else +# define ARG_LL "%I64" +# endif + +/* detect if we need to cast to unsigned int for FD_SET to avoid warnings */ +# ifdef HAVE_WINSOCK2_H +# define FD_SET_T (u_int) +# else +# define FD_SET_T +# endif /* Windows wants us to use _strdup instead of strdup */ # ifndef strdup @@ -1366,34 +1403,6 @@ AH_BOTTOM([ #include #include -/* the version of the windows API enabled */ -#ifndef WINVER -#define WINVER 0x0600 // 0x0502 -#endif -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0600 // 0x0502 -#endif -#ifdef HAVE_WINSOCK2_H -#include -#endif - -#ifdef HAVE_WS2TCPIP_H -#include -#endif - -#ifndef USE_WINSOCK -#define ARG_LL "%ll" -#else -#define ARG_LL "%I64" -#endif - -/* detect if we need to cast to unsigned int for FD_SET to avoid warnings */ -#ifdef HAVE_WINSOCK2_H -#define FD_SET_T (u_int) -#else -#define FD_SET_T -#endif - #ifdef __cplusplus extern "C" { #endif diff --git a/src/convert.c b/src/convert.c index d6289ecf..71f25491 100644 --- a/src/convert.c +++ b/src/convert.c @@ -32,10 +32,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include #include #include -#include "config.h" #ifndef USE_WINSOCK #include #endif diff --git a/src/dict.c b/src/dict.c index d6986788..99e347ad 100644 --- a/src/dict.c +++ b/src/dict.c @@ -34,8 +34,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include "config.h" +#include #ifndef USE_WINSOCK #include #include From a0c313412dbc5c152fe78eb93cf092f99d109ef9 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Wed, 4 Oct 2017 17:31:33 +0100 Subject: [PATCH 05/59] Adjust Unix socket/Winsock handling. Centralise it into util-internal.h, remove duplicate definitions from mdns, and add new pseudo-functions _getdns_closesocket(), _getdns_poll() and _getdns_socketerror(). Convert error values to simple values and convert error checking to use _getdns_socketerror() and the simple values. The simple values can also be used with the result from getsockopt() with SO_ERROR in stub.c. --- src/anchor.c | 8 ++-- src/context.c | 12 +---- src/extension/poll_eventloop.c | 12 +---- src/mdns.c | 72 +++++------------------------ src/mdns.h | 5 +- src/server.c | 31 +++---------- src/stub.c | 84 ++++++++-------------------------- src/util-internal.h | 42 ++++++++++++++--- 8 files changed, 81 insertions(+), 185 deletions(-) diff --git a/src/anchor.c b/src/anchor.c index d37cdec4..6872ab18 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -1198,7 +1198,7 @@ static void tas_read_cb(void *userarg) return; } } - } else if (_getdns_EWOULDBLOCK) + } else if (_getdns_socketerror() == _getdns_EWOULDBLOCK) return; DEBUG_ANCHOR("Read error: %d %s\n", (int)n, strerror(errno)); @@ -1248,7 +1248,7 @@ static void tas_write_cb(void *userarg) tas_read_cb, NULL, tas_timeout_cb)); return; - } else if (_getdns_EWOULDBLOCK || _getdns_EINPROGRESS) + } else if (_getdns_socketerror() == _getdns_EWOULDBLOCK || _getdns_socketerror() == _getdns_EINPROGRESS) return; DEBUG_ANCHOR("Write error: %s\n", strerror(errno)); @@ -1348,8 +1348,8 @@ static void tas_connect(getdns_context *context, tas_connection *a) addr.sin6_scope_id = 0; r = connect(a->fd, (struct sockaddr *)&addr, sizeof(addr)); } - if (r == 0 || (r == -1 && (_getdns_EINPROGRESS || - _getdns_EWOULDBLOCK))) { + if (r == 0 || (r == -1 && (_getdns_socketerror() == _getdns_EINPROGRESS || + _getdns_socketerror() == _getdns_EWOULDBLOCK))) { char tas_hostname[256]; const char *path = "", *fmt; getdns_return_t R; diff --git a/src/context.c b/src/context.c index ada3e7bd..9b43ff76 100644 --- a/src/context.c +++ b/src/context.c @@ -704,11 +704,7 @@ _getdns_upstreams_dereference(getdns_upstreams *upstreams) } if (upstream->fd != -1) { -#ifdef USE_WINSOCK - closesocket(upstream->fd); -#else - close(upstream->fd); -#endif + _getdns_closesocket(upstream->fd); } while (pin) { sha256_pin_t *nextpin = pin->next; @@ -809,11 +805,7 @@ _getdns_upstream_reset(getdns_upstream *upstream) upstream->tls_obj = NULL; } if (upstream->fd != -1) { -#ifdef USE_WINSOCK - closesocket(upstream->fd); -#else - close(upstream->fd); -#endif + _getdns_closesocket(upstream->fd); upstream->fd = -1; } /* Set connection ready for use again*/ diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index b4f204b1..b0793e7c 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -27,13 +27,7 @@ #include "config.h" -#ifdef HAVE_SYS_POLL_H -#include -#else -#ifndef USE_WINSOCK -#include -#endif -#endif +#include "util-internal.h" #ifdef HAVE_SYS_RESOURCE_H #include #endif @@ -411,10 +405,8 @@ poll_eventloop_run_once(getdns_eventloop *loop, int blocking) { Sleep(poll_timeout); } else - if (WSAPoll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { -#else - if (poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { #endif + if (poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { perror("poll() failed"); exit(EXIT_FAILURE); } diff --git a/src/mdns.c b/src/mdns.c index 073c48cb..3d5efe6e 100644 --- a/src/mdns.c +++ b/src/mdns.c @@ -30,24 +30,6 @@ #ifdef HAVE_MDNS_SUPPORT -#ifdef USE_WINSOCK -typedef u_short sa_family_t; -#define _getdns_EWOULDBLOCK (WSAGetLastError() == WSATRY_AGAIN ||\ - WSAGetLastError() == WSAEWOULDBLOCK) -#define _getdns_EINPROGRESS (WSAGetLastError() == WSAEINPROGRESS) -#else -#define _getdns_EWOULDBLOCK (errno == EAGAIN || errno == EWOULDBLOCK) -#define _getdns_EINPROGRESS (errno == EINPROGRESS) -#define SOCKADDR struct sockaddr -#define SOCKADDR_IN struct sockaddr_in -#define SOCKADDR_IN6 struct sockaddr_in6 -#define SOCKET int -#define IP_MREQ struct ip_mreq -#define IPV6_MREQ struct ipv6_mreq -#define BOOL int -#define TRUE 1 -#endif - /* Define IPV6_ADD_MEMBERSHIP for FreeBSD and Mac OS X */ #ifndef IPV6_ADD_MEMBERSHIP #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP @@ -1148,7 +1130,8 @@ mdns_udp_multicast_read_cb(void *userarg) sizeof(cnx->response), 0, NULL, NULL); - if (read == -1 && _getdns_EWOULDBLOCK) + if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || + _getdns_socketerror() == _getdns_ECONNRESET) return; /* TODO: this will stop the receive loop! */ if (read >= GLDNS_HEADER_SIZE) @@ -1353,11 +1336,7 @@ static int mdns_open_ipv4_multicast(SOCKADDR_STORAGE* mcast_dest, int* mcast_des if (ret != 0 && fd4 != -1) { -#ifdef USE_WINSOCK - closesocket(fd4); -#else - close(fd4); -#endif + _getdns_closesocket(fd4); fd4 = -1; } @@ -1428,11 +1407,7 @@ static int mdns_open_ipv6_multicast(SOCKADDR_STORAGE* mcast_dest, int* mcast_des if (ret != 0 && fd6 != -1) { -#ifdef USE_WINSOCK - closesocket(fd6); -#else - close(fd6); -#endif + _getdns_closesocket(fd6); fd6 = -1; } @@ -1514,11 +1489,7 @@ static getdns_return_t mdns_delayed_network_init(struct getdns_context *context) GETDNS_CLEAR_EVENT(context->extension , &context->mdns_connection[i].event); -#ifdef USE_WINSOCK - closesocket(context->mdns_connection[i].fd); -#else - close(context->mdns_connection[i].fd); -#endif + _getdns_closesocket(context->mdns_connection[i].fd); } } @@ -1657,11 +1628,7 @@ void _getdns_mdns_context_destroy(struct getdns_context *context) /* suppress the receive event */ GETDNS_CLEAR_EVENT(context->extension, &context->mdns_connection[i].event); /* close the socket */ -#ifdef USE_WINSOCK - closesocket(context->mdns_connection[i].fd); -#else - close(context->mdns_connection[i].fd); -#endif + _getdns_closesocket(context->mdns_connection[i].fd); } GETDNS_FREE(context->mf, context->mdns_connection); @@ -1686,11 +1653,7 @@ _getdns_cancel_mdns_request(getdns_network_req *netreq) { mdns_cleanup(netreq); if (netreq->fd >= 0) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); } } @@ -1706,11 +1669,7 @@ mdns_timeout_cb(void *userarg) /* Check the required cleanup */ mdns_cleanup(netreq); if (netreq->fd >= 0) -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); _getdns_netreq_change_state(netreq, NET_REQ_TIMED_OUT); if (netreq->owner->user_callback) { netreq->debug_end_time = _getdns_get_time_as_uintt64(); @@ -1745,7 +1704,8 @@ mdns_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && _getdns_EWOULDBLOCK) + if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || + _getdns_socketerror() == _getdns_ECONNRESET) return; if (read < GLDNS_HEADER_SIZE) @@ -1759,11 +1719,7 @@ mdns_udp_read_cb(void *userarg) // TODO: check that the source address originates from the local network. // TODO: check TTL = 255 -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); /* * TODO: how to handle an MDNS response with TC bit set? * Ignore it for now, as we do not support any kind of TCP fallback @@ -1814,11 +1770,7 @@ mdns_udp_write_cb(void *userarg) netreq->fd, (const void *)netreq->query, pkt_len, 0, (struct sockaddr *)&mdns_mcast_v4, sizeof(mdns_mcast_v4))) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); return; } GETDNS_SCHEDULE_EVENT( diff --git a/src/mdns.h b/src/mdns.h index b7c7d20c..e53f79a1 100644 --- a/src/mdns.h +++ b/src/mdns.h @@ -24,13 +24,10 @@ #ifdef HAVE_MDNS_SUPPORT #include "getdns/getdns.h" #include "types-internal.h" +#include "util-internal.h" #include "util/lruhash.h" #include "config.h" -#ifndef USE_WINSOCK -#define SOCKADDR_STORAGE struct sockaddr_storage -#endif - getdns_return_t _getdns_submit_mdns_request(getdns_network_req *netreq); diff --git a/src/server.c b/src/server.c index ab986a41..68b6d09d 100644 --- a/src/server.c +++ b/src/server.c @@ -39,6 +39,7 @@ #include "types-internal.h" #include "debug.h" #include "util/rbtree.h" +#include "util-internal.h" #include "server.h" #define DNS_REQUEST_SZ 4096 @@ -135,11 +136,7 @@ static void tcp_connection_destroy(tcp_connection *conn) loop->vmt->clear(loop, &conn->event); if (conn->fd >= 0) -#ifdef USE_WINSOCK - (void) closesocket(conn->fd); -#else - (void) close(conn->fd); -#endif + (void) _getdns_closesocket(conn->fd); GETDNS_FREE(*mf, conn->read_buf); for (cur = conn->to_write; cur; cur = next) { @@ -285,11 +282,7 @@ getdns_reply( (struct sockaddr *)&conn->remote_in, conn->addrlen) == -1) { /* IO error, cleanup this listener */ loop->vmt->clear(loop, &conn->l->event); -#ifdef USE_WINSOCK - closesocket(conn->l->fd); -#else - close(conn->l->fd); -#endif + _getdns_closesocket(conn->l->fd); conn->l->fd = -1; } /* Unlink this connection */ @@ -483,11 +476,7 @@ static void tcp_accept_cb(void *userarg) &conn->super.remote_in, &conn->super.addrlen)) == -1) { /* IO error, cleanup this listener */ loop->vmt->clear(loop, &l->event); -#ifdef USE_WINSOCK - closesocket(l->fd); -#else - close(l->fd); -#endif + _getdns_closesocket(l->fd); l->fd = -1; GETDNS_FREE(*mf, conn); return; @@ -557,11 +546,7 @@ static void udp_read_cb(void *userarg) (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { /* IO error, cleanup this listener. */ loop->vmt->clear(loop, &l->event); -#ifdef USE_WINSOCK - closesocket(l->fd); -#else - close(l->fd); -#endif + _getdns_closesocket(l->fd); l->fd = -1; #if 0 && defined(SERVER_DEBUG) && SERVER_DEBUG @@ -710,11 +695,7 @@ static void remove_listeners(listen_set *set) continue; loop->vmt->clear(loop, &l->event); -#ifdef USE_WINSOCK - closesocket(l->fd); -#else - close(l->fd); -#endif + _getdns_closesocket(l->fd); l->fd = -1; if (l->transport != GETDNS_TRANSPORT_TCP) diff --git a/src/stub.c b/src/stub.c index 1d16c4bb..4674356c 100644 --- a/src/stub.c +++ b/src/stub.c @@ -38,17 +38,6 @@ */ #define INTERCEPT_COM_DS 0 -#ifdef USE_POLL_DEFAULT_EVENTLOOP -# ifdef HAVE_SYS_POLL_H -# include -# else -#ifdef USE_WINSOCK -#define poll(fdarray, nbsockets, timer) WSAPoll(fdarray, nbsockets, timer) -#else -# include -#endif -# endif -#endif #include "debug.h" #include #include @@ -426,13 +415,10 @@ tcp_connect(getdns_upstream *upstream, getdns_transport_list_t transport) #endif if (connect(fd, (struct sockaddr *)&upstream->addr, upstream->addr_len) == -1) { - if (_getdns_EINPROGRESS || _getdns_EWOULDBLOCK) + if (_getdns_socketerror() == _getdns_EINPROGRESS || + _getdns_socketerror() == _getdns_EWOULDBLOCK) return fd; -#ifdef USE_WINSOCK - closesocket(fd); -#else - close(fd); -#endif + _getdns_closesocket(fd); return -1; } return fd; @@ -443,22 +429,13 @@ tcp_connected(getdns_upstream *upstream) { int error = 0; socklen_t len = (socklen_t)sizeof(error); getsockopt(upstream->fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len); -#ifdef USE_WINSOCK - if (error == WSAEINPROGRESS) + if (error == _getdns_EINPROGRESS) return STUB_TCP_AGAIN; - else if (error == WSAEWOULDBLOCK) - return STUB_TCP_WOULDBLOCK; - else if (error != 0) - return STUB_SETUP_ERROR; -#else - if (error == EINPROGRESS) - return STUB_TCP_AGAIN; - else if (error == EWOULDBLOCK || error == EAGAIN) + else if (error == _getdns_EWOULDBLOCK || error == _getdns_EAGAIN) return STUB_TCP_WOULDBLOCK; else if (error != 0) { return STUB_SETUP_ERROR; } -#endif if (upstream->transport == GETDNS_TRANSPORT_TCP && upstream->queries_sent == 0) { upstream->conn_state = GETDNS_CONN_OPEN; @@ -570,11 +547,7 @@ _getdns_cancel_stub_request(getdns_network_req *netreq) STUB_DEBUG_CLEANUP, __FUNC__, (void*)netreq); stub_cleanup(netreq); if (netreq->fd >= 0) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); netreq->fd = -1; } } @@ -589,11 +562,7 @@ stub_timeout_cb(void *userarg) _getdns_netreq_change_state(netreq, NET_REQ_TIMED_OUT); /* Handle upstream*/ if (netreq->fd >= 0) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); netreq->fd = -1; netreq->upstream->udp_timeouts++; if (netreq->upstream->udp_timeouts % 100 == 0) @@ -650,7 +619,7 @@ upstream_setup_timeout_cb(void *userarg) #ifdef USE_POLL_DEFAULT_EVENTLOOP fds.fd = upstream->fd; fds.events = POLLOUT; - ret = poll(&fds, 1, 0); + ret = _getdns_poll(&fds, 1, 0); #else FD_ZERO(&fds); FD_SET((int)(upstream->fd), &fds); @@ -690,7 +659,7 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } read = recv(fd, (void *)tcp->read_pos, tcp->to_read, 0); if (read < 0) { - if (_getdns_EWOULDBLOCK) + if (_getdns_socketerror() == _getdns_EWOULDBLOCK) return STUB_TCP_WOULDBLOCK; else return STUB_TCP_ERROR; @@ -807,11 +776,11 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) (struct sockaddr *)&(netreq->upstream->addr), netreq->upstream->addr_len); #endif - if ((written < 0 && (_getdns_EWOULDBLOCK || + if ((written < 0 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || /* Add the error case where the connection is in progress which is when a cookie is not available (e.g. when doing the first request to an upstream). We must let the handshake complete since non-blocking. */ - _getdns_EINPROGRESS)) || + _getdns_socketerror() == _getdns_EINPROGRESS)) || (size_t)written < pkt_len + 2) { /* We couldn't write the whole packet. @@ -847,7 +816,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) tcp->write_buf_len - tcp->written); #endif if (written == -1) { - if (_getdns_EWOULDBLOCK) + if (_getdns_socketerror() == _getdns_EWOULDBLOCK) return STUB_TCP_WOULDBLOCK; else { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" @@ -1386,7 +1355,8 @@ stub_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && _getdns_EWOULDBLOCK) + if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || + _getdns_socketerror() == _getdns_ECONNRESET)) return; /* Try again later */ if (read == -1) { @@ -1398,11 +1368,7 @@ stub_udp_read_cb(void *userarg) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); /* Handle upstream*/ if (netreq->fd >= 0) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); netreq->fd = -1; stub_next_upstream(netreq); } @@ -1422,11 +1388,7 @@ stub_udp_read_cb(void *userarg) GETDNS_CLEAR_EVENT(dnsreq->loop, &netreq->event); -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); netreq->fd = -1; while (GLDNS_TC_WIRE(netreq->response)) { DEBUG_STUB("%s %-35s: MSG: %p TC bit set in response \n", STUB_DEBUG_READ, @@ -1519,11 +1481,7 @@ stub_udp_write_cb(void *userarg) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); /* Handle upstream*/ if (netreq->fd >= 0) { -#ifdef USE_WINSOCK - closesocket(netreq->fd); -#else - close(netreq->fd); -#endif + _getdns_closesocket(netreq->fd); netreq->fd = -1; stub_next_upstream(netreq); } @@ -2055,11 +2013,7 @@ upstream_connect(getdns_upstream *upstream, getdns_transport_list_t transport, if (upstream->tls_obj == NULL) { upstream_failed(upstream, 1); _getdns_upstream_reset(upstream); -#ifdef USE_WINSOCK - closesocket(fd); -#else - close(fd); -#endif + _getdns_closesocket(fd); return -1; } upstream->tls_hs_state = GETDNS_HS_WRITE; @@ -2128,7 +2082,7 @@ upstream_find_for_netreq(getdns_network_req *netreq) continue; if (fd == -1) { - if (_getdns_EMFILE) + if (_getdns_socketerror() == _getdns_EMFILE) return STUB_TRY_AGAIN_LATER; return -1; } diff --git a/src/util-internal.h b/src/util-internal.h index 1ef007bc..faab07b0 100644 --- a/src/util-internal.h +++ b/src/util-internal.h @@ -221,14 +221,42 @@ INLINE uint64_t _getdns_ms_until_expiry2(uint64_t expires, uint64_t *now_ms) #ifdef USE_WINSOCK typedef u_short sa_family_t; -#define _getdns_EWOULDBLOCK (WSAGetLastError() == WSATRY_AGAIN ||\ - WSAGetLastError() == WSAEWOULDBLOCK) -#define _getdns_EINPROGRESS (WSAGetLastError() == WSAEINPROGRESS) -#define _getdns_EMFILE (WSAGetLastError() == WSAEMFILE) +#define _getdns_EAGAIN (WSATRY_AGAIN) +#define _getdns_EWOULDBLOCK (WSAEWOULDBLOCK) +#define _getdns_EINPROGRESS (WSAEINPROGRESS) +#define _getdns_EMFILE (WSAEMFILE) +#define _getdns_ECONNRESET (WSAECONNRESET) + +#define _getdns_closesocket(fd) closesocket(fd) +#define _getdns_poll(fdarray, nsockets, timer) WSAPoll(fdarray, nsockets, timer) +#define _getdns_socketerror() (WSAGetLastError()) #else -#define _getdns_EWOULDBLOCK (errno == EAGAIN || errno == EWOULDBLOCK) -#define _getdns_EINPROGRESS (errno == EINPROGRESS) -#define _getdns_EMFILE (errno == EMFILE) +#ifdef HAVE_SYS_POLL_H +# include +#else +# include +#endif + +#define _getdns_EAGAIN (EAGAIN) +#define _getdns_EWOULDBLOCK (EWOULDBLOCK) +#define _getdns_EINPROGRESS (EINPROGRESS) +#define _getdns_EMFILE (EMFILE) +#define _getdns_ECONNRESET (ECONNRESET) + +#define SOCKADDR struct sockaddr +#define SOCKADDR_IN struct sockaddr_in +#define SOCKADDR_IN6 struct sockaddr_in6 +#define SOCKADDR_STORAGE struct sockaddr_storage +#define SOCKET int + +#define IP_MREQ struct ip_mreq +#define IPV6_MREQ struct ipv6_mreq +#define BOOL int +#define TRUE 1 + +#define _getdns_closesocket(fd) close(fd) +#define _getdns_poll(fdarray, nsockets, timer) poll(fdarray, nsockets, timer) +#define _getdns_socketerror() (errno) #endif #endif From 757becc81201875f7e6c2872cbe25231033c9bbc Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Wed, 4 Oct 2017 17:32:52 +0100 Subject: [PATCH 06/59] write() on a socket is equivalent to send() with flag value of 0. --- src/stub.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/stub.c b/src/stub.c index 4674356c..5d472f72 100644 --- a/src/stub.c +++ b/src/stub.c @@ -808,13 +808,8 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) /* Coming back from an earlier unfinished write or handshake. * Try to send remaining data */ -#ifdef USE_WINSOCK written = send(fd, (void *)(tcp->write_buf + tcp->written), tcp->write_buf_len - tcp->written, 0); -#else - written = write(fd, tcp->write_buf + tcp->written, - tcp->write_buf_len - tcp->written); -#endif if (written == -1) { if (_getdns_socketerror() == _getdns_EWOULDBLOCK) return STUB_TCP_WOULDBLOCK; From 1eae1ad96bc78437e9baf540949231d7958bbedd Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Wed, 4 Oct 2017 17:42:06 +0100 Subject: [PATCH 07/59] Fix problem where Stubby stops listening to UDP on Win10. Winsock can return ECONNRESET when receiving UDP via recvfrom() if an ICMP Port Unreachable has been received. Rather than treat the socket as being in error and closing it, just ignore the error. --- src/server.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server.c b/src/server.c index 68b6d09d..319991da 100644 --- a/src/server.c +++ b/src/server.c @@ -544,6 +544,14 @@ static void udp_read_cb(void *userarg) conn->addrlen = sizeof(conn->remote_in); if ((len = recvfrom(l->fd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { + if (_getdns_socketerror() == _getdns_ECONNRESET) { + /* + * WINSOCK gives ECONNRESET on ICMP Port Unreachable + * being received. Ignore it. + * */ + GETDNS_FREE(*mf, conn); + return; + } /* IO error, cleanup this listener. */ loop->vmt->clear(loop, &l->event); _getdns_closesocket(l->fd); From a70efd118d5fd372d7ed891eb75cadd9fd39eb90 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 5 Oct 2017 12:36:03 +0100 Subject: [PATCH 08/59] Fix build warnings about inet_ntop() not being declared on Win10/MinGW. --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index ca8c6d81..d08beefb 100644 --- a/configure.ac +++ b/configure.ac @@ -1274,7 +1274,7 @@ CFLAGS="$CFLAGS $LIBBSD_CFLAGS" ],[ AC_MSG_WARN([libbsd not found or usable; using embedded code instead]) ]) -AC_CHECK_DECLS([strlcpy,arc4random,arc4random_uniform]) +AC_CHECK_DECLS([inet_pton,inet_ntop,strlcpy,arc4random,arc4random_uniform]) AC_REPLACE_FUNCS(inet_pton) AC_REPLACE_FUNCS(inet_ntop) AC_REPLACE_FUNCS(strlcpy) @@ -1449,11 +1449,11 @@ void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); unsigned char *SHA512(void* data, unsigned int data_len, unsigned char *digest); #endif /* COMPAT_SHA512 */ -#ifndef HAVE_INET_PTON +#ifndef HAVE_DECL_INET_PTON int inet_pton(int af, const char* src, void* dst); #endif /* HAVE_INET_PTON */ -#ifndef HAVE_INET_NTOP +#ifndef HAVE_DECL_INET_NTOP const char *inet_ntop(int af, const void *src, char *dst, size_t size); #endif From ff7c85ab20a7c386ef1ab0e141f17628524013de Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 5 Oct 2017 12:43:35 +0100 Subject: [PATCH 09/59] Fix build errors introduced by a0c3134. --- src/mdns.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mdns.c b/src/mdns.c index 3d5efe6e..7578a262 100644 --- a/src/mdns.c +++ b/src/mdns.c @@ -1131,7 +1131,7 @@ mdns_udp_multicast_read_cb(void *userarg) if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || - _getdns_socketerror() == _getdns_ECONNRESET) + _getdns_socketerror() == _getdns_ECONNRESET)) return; /* TODO: this will stop the receive loop! */ if (read >= GLDNS_HEADER_SIZE) @@ -1705,7 +1705,7 @@ mdns_udp_read_cb(void *userarg) */ 0, NULL, NULL); if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || - _getdns_socketerror() == _getdns_ECONNRESET) + _getdns_socketerror() == _getdns_ECONNRESET)) return; if (read < GLDNS_HEADER_SIZE) From 59e6ec80fe4041e89f674c74af0bc0b8dc79a0f1 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 5 Oct 2017 15:04:40 +0100 Subject: [PATCH 10/59] Fix configure runtime error. Error was: checking for DSA_SIG_new... yes ../configure: line 13315: test: too many arguments --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d08beefb..49fa72d5 100644 --- a/configure.ac +++ b/configure.ac @@ -589,7 +589,7 @@ case "$enable_ed25519" in no) ;; *) - if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then + if test "$USE_NSS" = "no" -a "$USE_NETTLE" = "no"; then AC_CHECK_DECLS([NID_ED25519], [ AC_DEFINE_UNQUOTED([USE_ED25519], [1], [Define this to enable ED25519 support.]) use_ed25519="yes" From 8a291d4dce4fb50887924f0b89702ecf276386f4 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 5 Oct 2017 19:15:41 +0100 Subject: [PATCH 11/59] Revise autoconf checking for sigset_t. The previous strategy for Windows of checking for sigset_t and if it failed repeating the check with -D_POSIX did not work as expected. Autoconf found the second instance of the test, thought it was the same as the first, and used the cached result from the first. It was only because a typo did not reset CFLAGS back, so always adding _POSIX, that this worked with mingw. Change instead to checking for sigset_t and if that fails for _sigset_t, and in config.h if sigset_t does not exist but _sigset_t does then typedef _sigset_t to sigset_t. Also amend the implementation of sigfillset() to cast to sigset_t not _sigset_t; it may not be just mingw that doesn't have sigfilleset(). Also, ensure signal.h is one of the headers included when checking for sigset_t. It's the header Posix says sigset_t is defined in... --- configure.ac | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index 49fa72d5..b2c92692 100644 --- a/configure.ac +++ b/configure.ac @@ -254,7 +254,7 @@ esac DEFAULT_EVENTLOOP=select_eventloop -AC_CHECK_HEADERS([sys/poll.h poll.h sys/resource.h sys/types.h],,, [AC_INCLUDES_DEFAULT]) +AC_CHECK_HEADERS([signal.h sys/poll.h poll.h sys/resource.h sys/types.h],,, [AC_INCLUDES_DEFAULT]) AC_ARG_ENABLE(poll-eventloop, AC_HELP_STRING([--disable-poll-eventloop], [Disable default eventloop based on poll (default=enabled if available)])) case "$enable_poll_eventloop" in no) @@ -677,29 +677,29 @@ if test "$USE_WINSOCK" = 1; then LIBS="$LIBS -lgdi32 -liphlpapi" fi -dnl Check if -D_POSIX is needed for sigset_t - -AC_CHECK_TYPE([sigset_t], [ - AC_MSG_NOTICE(-D_POSIX is NOT needed for the sigset_t type) -], [ - BACKCFLAGS="$CFLAGS" - CFLAGS="-D_POSIX $CFLAGS" - AC_CHECK_TYPE([sigset_t], [ - AC_MSG_NOTICE(-D_POSIX is needed for the sigset_t type) - ], [ - AC_MSG_NOTICE(Unclear whether -D_POSIX is needed for the sigset_t type) - BACKCFLAGS="$CFLAGS" - ], [AC_INCLUDES_DEFAULT +dnl sigset_t or _sigset_t? MinGW is latter by default. +AC_CHECK_TYPES([sigset_t], + [], + [AC_CHECK_TYPES([_sigset_t], + [], + [AC_MSG_ERROR([Can't find type `sigset_t' or type `_sigset_t'])], + [AC_INCLUDES_DEFAULT +#ifdef HAVE_SIGNAL_H +#include +#endif #ifdef HAVE_SYS_TYPES_H #include #endif - ]) -], [AC_INCLUDES_DEFAULT + ]) + ], + [AC_INCLUDES_DEFAULT +#ifdef HAVE_SIGNAL_H +#include +#endif #ifdef HAVE_SYS_TYPES_H #include #endif ]) - AC_CHECK_FUNCS(sigemptyset sigfillset sigaddset) my_with_libidn=1 @@ -1566,11 +1566,14 @@ struct tm; char *strptime(const char *s, const char *format, struct tm *tm); #endif +#if !defined(HAVE_SIGSET_T) && defined(HAVE__SIGSET_T) +typedef _sigset_t sigset_t; +#endif #if !defined(HAVE_SIGEMPTYSET) # define sigemptyset(pset) (*(pset) = 0) #endif #if !defined(HAVE_SIGFILLSET) -# define sigfillset(pset) (*(pset) = (_sigset_t)-1) +# define sigfillset(pset) (*(pset) = (sigset_t)-1) #endif #if !defined(HAVE_SIGADDSET) # define sigaddset(pset, num) (*(pset) |= (1L<<(num))) From 0874a0a4722818510588c12972744794147af488 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 5 Oct 2017 19:17:12 +0100 Subject: [PATCH 12/59] Use PRI format strings in wire2str.c and remove ARG_LL. --- configure.ac | 6 ------ src/gldns/wire2str.c | 15 +++------------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index b2c92692..1c7dc8e1 100644 --- a/configure.ac +++ b/configure.ac @@ -1376,12 +1376,6 @@ AH_BOTTOM([ # include # endif -# ifndef USE_WINSOCK -# define ARG_LL "%ll" -# else -# define ARG_LL "%I64" -# endif - /* detect if we need to cast to unsigned int for FD_SET to avoid warnings */ # ifdef HAVE_WINSOCK2_H # define FD_SET_T (u_int) diff --git a/src/gldns/wire2str.c b/src/gldns/wire2str.c index 2718925e..f6fda2e5 100644 --- a/src/gldns/wire2str.c +++ b/src/gldns/wire2str.c @@ -1059,11 +1059,7 @@ int gldns_wire2str_tsigtime_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) d4 = (*d)[4]; d5 = (*d)[5]; tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5; -#ifndef USE_WINSOCK - w = gldns_str_print(s, sl, "%llu", (long long)tsigtime); -#else - w = gldns_str_print(s, sl, "%I64u", (long long)tsigtime); -#endif + w = gldns_str_print(s, sl, "%"PRIu64, (uint64_t)tsigtime); (*d)+=6; (*dl)-=6; return w; @@ -1746,13 +1742,8 @@ int gldns_wire2str_edns_llq_print(char** s, size_t* sl, uint8_t* data, if(error_code < llq_errors_num) w += gldns_str_print(s, sl, " %s", llq_errors[error_code]); else w += gldns_str_print(s, sl, " error %d", (int)error_code); -#ifndef USE_WINSOCK - w += gldns_str_print(s, sl, " id %llx lease-life %lu", - (unsigned long long)llq_id, (unsigned long)lease_life); -#else - w += gldns_str_print(s, sl, " id %I64x lease-life %lu", - (unsigned long long)llq_id, (unsigned long)lease_life); -#endif + w += gldns_str_print(s, sl, " id %"PRIx64" lease-life %lu", + (uint64_t)llq_id, (unsigned long)lease_life); return w; } From dc7daede40138d3359cd217998463b2a0efc5e2f Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 12:07:15 +0100 Subject: [PATCH 13/59] Move Windows/Unix functions into new platform.h. --- src/anchor.c | 1 + src/context.c | 1 + src/extension/poll_eventloop.c | 1 + src/mdns.c | 1 + src/server.c | 1 + src/stub.c | 1 + src/util-internal.h | 41 ---------------------------------- 7 files changed, 6 insertions(+), 41 deletions(-) diff --git a/src/anchor.c b/src/anchor.c index 6872ab18..a5a31b2e 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -50,6 +50,7 @@ #include "gldns/keyraw.h" #include "general.h" #include "util-internal.h" +#include "platform.h" /* get key usage out of its extension, returns 0 if no key_usage extension */ static unsigned long diff --git a/src/context.c b/src/context.c index 9b43ff76..3456bfa0 100644 --- a/src/context.c +++ b/src/context.c @@ -80,6 +80,7 @@ typedef unsigned short in_port_t; #include "context.h" #include "types-internal.h" #include "util-internal.h" +#include "platform.h" #include "dnssec.h" #include "stub.h" #include "list.h" diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index b0793e7c..f6fdddda 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -28,6 +28,7 @@ #include "config.h" #include "util-internal.h" +#include "platform.h" #ifdef HAVE_SYS_RESOURCE_H #include #endif diff --git a/src/mdns.c b/src/mdns.c index 7578a262..30bdab6e 100644 --- a/src/mdns.c +++ b/src/mdns.c @@ -26,6 +26,7 @@ #include "gldns/pkthdr.h" #include "gldns/rrdef.h" #include "util-internal.h" +#include "platform.h" #include "mdns.h" #ifdef HAVE_MDNS_SUPPORT diff --git a/src/server.c b/src/server.c index 319991da..f29cb603 100644 --- a/src/server.c +++ b/src/server.c @@ -40,6 +40,7 @@ #include "debug.h" #include "util/rbtree.h" #include "util-internal.h" +#include "platform.h" #include "server.h" #define DNS_REQUEST_SZ 4096 diff --git a/src/stub.c b/src/stub.c index 5d472f72..ebcb2527 100644 --- a/src/stub.c +++ b/src/stub.c @@ -52,6 +52,7 @@ #include "rr-iter.h" #include "context.h" #include "util-internal.h" +#include "platform.h" #include "general.h" #include "pubkey-pinning.h" diff --git a/src/util-internal.h b/src/util-internal.h index faab07b0..3d768de1 100644 --- a/src/util-internal.h +++ b/src/util-internal.h @@ -218,46 +218,5 @@ INLINE uint64_t _getdns_ms_until_expiry2(uint64_t expires, uint64_t *now_ms) return *now_ms >= expires ? 0 : expires - *now_ms; } - -#ifdef USE_WINSOCK -typedef u_short sa_family_t; -#define _getdns_EAGAIN (WSATRY_AGAIN) -#define _getdns_EWOULDBLOCK (WSAEWOULDBLOCK) -#define _getdns_EINPROGRESS (WSAEINPROGRESS) -#define _getdns_EMFILE (WSAEMFILE) -#define _getdns_ECONNRESET (WSAECONNRESET) - -#define _getdns_closesocket(fd) closesocket(fd) -#define _getdns_poll(fdarray, nsockets, timer) WSAPoll(fdarray, nsockets, timer) -#define _getdns_socketerror() (WSAGetLastError()) -#else -#ifdef HAVE_SYS_POLL_H -# include -#else -# include -#endif - -#define _getdns_EAGAIN (EAGAIN) -#define _getdns_EWOULDBLOCK (EWOULDBLOCK) -#define _getdns_EINPROGRESS (EINPROGRESS) -#define _getdns_EMFILE (EMFILE) -#define _getdns_ECONNRESET (ECONNRESET) - -#define SOCKADDR struct sockaddr -#define SOCKADDR_IN struct sockaddr_in -#define SOCKADDR_IN6 struct sockaddr_in6 -#define SOCKADDR_STORAGE struct sockaddr_storage -#define SOCKET int - -#define IP_MREQ struct ip_mreq -#define IPV6_MREQ struct ipv6_mreq -#define BOOL int -#define TRUE 1 - -#define _getdns_closesocket(fd) close(fd) -#define _getdns_poll(fdarray, nsockets, timer) poll(fdarray, nsockets, timer) -#define _getdns_socketerror() (errno) -#endif - #endif /* util-internal.h */ From eb6da94e257f87827e71b79eabec9b36fd5d938b Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 12:07:47 +0100 Subject: [PATCH 14/59] Convert one more poll() to _getdns_poll(). --- src/extension/poll_eventloop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index f6fdddda..7d6bb99c 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -407,7 +407,7 @@ poll_eventloop_run_once(getdns_eventloop *loop, int blocking) Sleep(poll_timeout); } else #endif - if (poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { + if (_getdns_poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { perror("poll() failed"); exit(EXIT_FAILURE); } From 74eaf4b03e0283fd8d55d762986f234a8a7eb7e1 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 14:38:59 +0100 Subject: [PATCH 15/59] Previous commit omitted platform.h. --- src/platform.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/platform.h diff --git a/src/platform.h b/src/platform.h new file mode 100644 index 00000000..0cd4c9f6 --- /dev/null +++ b/src/platform.h @@ -0,0 +1,81 @@ +/** + * + * /brief general functions with platform-dependent implementations + * + */ + +/* + * Copyright (c) 2017, NLnet Labs, Sinodun + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the names of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PLATFORM_H +#define PLATFORM_H + +#include "config.h" + +#ifdef USE_WINSOCK +typedef u_short sa_family_t; +#define _getdns_EAGAIN (WSATRY_AGAIN) +#define _getdns_EWOULDBLOCK (WSAEWOULDBLOCK) +#define _getdns_EINPROGRESS (WSAEINPROGRESS) +#define _getdns_EMFILE (WSAEMFILE) +#define _getdns_ECONNRESET (WSAECONNRESET) + +#define _getdns_closesocket(fd) closesocket(fd) +#define _getdns_poll(fdarray, nsockets, timer) WSAPoll(fdarray, nsockets, timer) +#define _getdns_socketerror() (WSAGetLastError()) + +#else /* USE_WINSOCK */ + +#ifdef HAVE_SYS_POLL_H +# include +#else +# include +#endif + +#define _getdns_EAGAIN (EAGAIN) +#define _getdns_EWOULDBLOCK (EWOULDBLOCK) +#define _getdns_EINPROGRESS (EINPROGRESS) +#define _getdns_EMFILE (EMFILE) +#define _getdns_ECONNRESET (ECONNRESET) + +#define SOCKADDR struct sockaddr +#define SOCKADDR_IN struct sockaddr_in +#define SOCKADDR_IN6 struct sockaddr_in6 +#define SOCKADDR_STORAGE struct sockaddr_storage +#define SOCKET int + +#define IP_MREQ struct ip_mreq +#define IPV6_MREQ struct ipv6_mreq +#define BOOL int +#define TRUE 1 + +#define _getdns_closesocket(fd) close(fd) +#define _getdns_poll(fdarray, nsockets, timer) poll(fdarray, nsockets, timer) +#define _getdns_socketerror() (errno) +#endif + +#endif From 5e415b60b6a9cfb9762c504da9b328435ec2ea69 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 15:04:49 +0100 Subject: [PATCH 16/59] Add missing platform.h include. --- src/mdns.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mdns.h b/src/mdns.h index e53f79a1..79ec05fe 100644 --- a/src/mdns.h +++ b/src/mdns.h @@ -25,6 +25,7 @@ #include "getdns/getdns.h" #include "types-internal.h" #include "util-internal.h" +#include "platform.h" #include "util/lruhash.h" #include "config.h" From 34f4e138332b16fed2d4dfbbfd469a2e0983c95d Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 16:24:56 +0100 Subject: [PATCH 17/59] Have separate Windows DEBUG_NL() similar to DEBUG_ON(). This removes a build warning. --- src/debug.h | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/debug.h b/src/debug.h index 8f3c2c33..d048def5 100644 --- a/src/debug.h +++ b/src/debug.h @@ -59,6 +59,20 @@ fprintf(stderr, "[%s.%.6d] ", buf_dEbUgSyM, (int)tv_dEbUgSyM.tv_usec); \ fprintf(stderr, __VA_ARGS__); \ } while (0) + +#define DEBUG_NL(...) do { \ + struct timeval tv_dEbUgSyM; \ + struct tm tm_dEbUgSyM; \ + char buf_dEbUgSyM[10]; \ + time_t tsec_dEbUgSyM; \ + \ + gettimeofday(&tv_dEbUgSyM, NULL); \ + tsec_dEbUgSyM = (time_t) tv_dEbUgSyM.tv_sec; \ + gmtime_s(&tm_dEbUgSyM, (const time_t *) &tsec_dEbUgSyM); \ + strftime(buf_dEbUgSyM, 10, "%H:%M:%S", &tm_dEbUgSyM); \ + fprintf(stderr, "[%s.%.6d] ", buf_dEbUgSyM, (int)tv_dEbUgSyM.tv_usec); \ + fprintf(stderr, __VA_ARGS__); \ + } while (0) #else #define DEBUG_ON(...) do { \ struct timeval tv_dEbUgSyM; \ @@ -71,9 +85,8 @@ fprintf(stderr, "[%s.%.6d] ", buf_dEbUgSyM, (int)tv_dEbUgSyM.tv_usec); \ fprintf(stderr, __VA_ARGS__); \ } while (0) -#endif -#define DEBUG_NL(...) do { \ +#define DEBUG_NL(...) do { \ struct timeval tv_dEbUgSyM; \ struct tm tm_dEbUgSyM; \ char buf_dEbUgSyM[10]; \ @@ -85,7 +98,7 @@ fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, "\n"); \ } while (0) - +#endif #define DEBUG_OFF(...) do {} while (0) From 4ca8ee008b40b2785fa02aded51179b9f22bc3eb Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Fri, 6 Oct 2017 18:15:18 +0100 Subject: [PATCH 18/59] Add _getdns_perror(). On Windows this reports Winsock errors. --- src/Makefile.in | 189 ++++++++++++++----------------- src/extension/poll_eventloop.c | 2 +- src/extension/select_eventloop.c | 3 +- src/platform.c | 69 +++++++++++ src/platform.h | 5 +- 5 files changed, 162 insertions(+), 106 deletions(-) create mode 100644 src/platform.c diff --git a/src/Makefile.in b/src/Makefile.in index f77b7447..bccaac04 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -77,7 +77,7 @@ C99COMPATFLAGS=@C99COMPATFLAGS@ DEFAULT_EVENTLOOP_OBJ=@DEFAULT_EVENTLOOP@.lo GETDNS_OBJ=const-info.lo convert.lo dict.lo dnssec.lo general.lo \ - list.lo request-internal.lo pubkey-pinning.lo rr-dict.lo \ + list.lo request-internal.lo platform.lo pubkey-pinning.lo rr-dict.lo \ rr-iter.lo server.lo stub.lo sync.lo ub_loop.lo util-internal.lo \ mdns.lo @@ -281,8 +281,7 @@ depend: FORCE: # Dependencies for gldns, utils, the extensions and compat functions -anchor.lo anchor.o: $(srcdir)/anchor.c \ - config.h \ +anchor.lo anchor.o: $(srcdir)/anchor.c config.h \ $(srcdir)/debug.h $(srcdir)/anchor.h \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -293,15 +292,13 @@ anchor.lo anchor.o: $(srcdir)/anchor.c \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h $(srcdir)/yxml/yxml.h \ $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h \ - $(srcdir)/gldns/keyraw.h $(srcdir)/general.h $(srcdir)/util-internal.h + $(srcdir)/gldns/keyraw.h $(srcdir)/general.h $(srcdir)/util-internal.h $(srcdir)/platform.h const-info.lo const-info.o: $(srcdir)/const-info.c \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/const-info.h -context.lo context.o: $(srcdir)/context.c \ - config.h \ - $(srcdir)/anchor.h \ - getdns/getdns.h \ +context.lo context.o: $(srcdir)/context.c config.h \ + $(srcdir)/anchor.h getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/debug.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/context.h \ @@ -309,36 +306,33 @@ context.lo context.o: $(srcdir)/context.c \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ - $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h \ - $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h $(srcdir)/pubkey-pinning.h -convert.lo convert.o: $(srcdir)/convert.c \ - config.h \ + $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util-internal.h $(srcdir)/platform.h $(srcdir)/dnssec.h \ + $(srcdir)/gldns/rrdef.h $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h $(srcdir)/pubkey-pinning.h +convert.lo convert.o: $(srcdir)/convert.c config.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h \ $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/extension/default_eventloop.h \ - $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h \ + $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h \ $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/wire2str.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h $(srcdir)/const-info.h $(srcdir)/dict.h \ - $(srcdir)/list.h $(srcdir)/jsmn/jsmn.h $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h $(srcdir)/convert.h -dict.lo dict.o: $(srcdir)/dict.c \ - config.h \ + $(srcdir)/list.h $(srcdir)/jsmn/jsmn.h $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h $(srcdir)/convert.h \ + $(srcdir)/debug.h +dict.lo dict.o: $(srcdir)/dict.c config.h \ $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h $(srcdir)/context.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/const-info.h $(srcdir)/gldns/wire2str.h \ $(srcdir)/gldns/parseutil.h -dnssec.lo dnssec.o: $(srcdir)/dnssec.c \ - config.h \ - $(srcdir)/debug.h \ - getdns/getdns.h \ +dnssec.lo dnssec.o: $(srcdir)/dnssec.c config.h \ + $(srcdir)/debug.h getdns/getdns.h \ $(srcdir)/context.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ @@ -350,31 +344,28 @@ dnssec.lo dnssec.o: $(srcdir)/dnssec.c \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/keyraw.h \ $(srcdir)/gldns/parseutil.h $(srcdir)/general.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/util/val_secalgo.h \ $(srcdir)/util/orig-headers/val_secalgo.h -general.lo general.o: $(srcdir)/general.c \ - config.h \ - $(srcdir)/general.h \ - getdns/getdns.h \ +general.lo general.o: $(srcdir)/general.c config.h \ + $(srcdir)/general.h getdns/getdns.h \ $(srcdir)/types-internal.h \ getdns/getdns_extra.h \ - $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/ub_loop.h $(srcdir)/debug.h \ - $(srcdir)/gldns/wire2str.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ - $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/gldns/wire2str.h $(srcdir)/context.h \ + $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h $(srcdir)/stub.h \ - $(srcdir)/dict.h $(srcdir)/mdns.h + $(srcdir)/dict.h $(srcdir)/mdns.h $(srcdir)/platform.h $(srcdir)/debug.h list.lo list.o: $(srcdir)/list.c $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h \ - config.h \ - $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + config.h $(srcdir)/context.h \ + $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/list.h $(srcdir)/dict.h -mdns.lo mdns.o: $(srcdir)/mdns.c \ - config.h \ +mdns.lo mdns.o: $(srcdir)/mdns.c config.h \ $(srcdir)/debug.h $(srcdir)/context.h \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -383,14 +374,13 @@ mdns.lo mdns.o: $(srcdir)/mdns.c \ $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/gldns/rrdef.h $(srcdir)/util-internal.h $(srcdir)/mdns.h \ - $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/lookup3.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/gldns/rrdef.h $(srcdir)/util-internal.h \ + $(srcdir)/platform.h $(srcdir)/mdns.h $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/lookup3.h \ $(srcdir)/util/orig-headers/lookup3.h +platform.lo platform.o: $(srcdir)/platform.c pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c \ - config.h \ - $(srcdir)/debug.h \ - getdns/getdns.h \ - $(srcdir)/context.h \ + config.h $(srcdir)/debug.h \ + getdns/getdns.h $(srcdir)/context.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ @@ -399,17 +389,16 @@ pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h request-internal.lo request-internal.o: $(srcdir)/request-internal.c \ - config.h \ - $(srcdir)/types-internal.h \ + config.h $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h $(srcdir)/context.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h \ - $(srcdir)/dict.h $(srcdir)/convert.h $(srcdir)/general.h + $(srcdir)/dict.h $(srcdir)/debug.h $(srcdir)/convert.h $(srcdir)/general.h rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h \ config.h \ getdns/getdns.h \ @@ -417,7 +406,7 @@ rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h \ $(srcdir)/dict.h @@ -425,18 +414,16 @@ rr-iter.lo rr-iter.o: $(srcdir)/rr-iter.c $(srcdir)/rr-iter.h $(srcdir)/rr-dict. config.h \ getdns/getdns.h \ $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h -server.lo server.o: $(srcdir)/server.c \ - config.h \ +server.lo server.o: $(srcdir)/server.c config.h \ getdns/getdns_extra.h \ - getdns/getdns.h \ - $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ + getdns/getdns.h $(srcdir)/context.h \ + $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h -stub.lo stub.o: $(srcdir)/stub.c \ - config.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/debug.h $(srcdir)/util-internal.h $(srcdir)/platform.h +stub.lo stub.o: $(srcdir)/stub.c config.h \ $(srcdir)/debug.h $(srcdir)/stub.h \ getdns/getdns.h \ $(srcdir)/types-internal.h \ @@ -447,58 +434,51 @@ stub.lo stub.o: $(srcdir)/stub.c \ $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/anchor.h \ - $(srcdir)/util-internal.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h -sync.lo sync.o: $(srcdir)/sync.c \ - getdns/getdns.h \ - config.h \ - $(srcdir)/context.h \ + $(srcdir)/util-internal.h $(srcdir)/platform.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h +sync.lo sync.o: $(srcdir)/sync.c getdns/getdns.h \ + config.h $(srcdir)/context.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h \ $(srcdir)/stub.h $(srcdir)/gldns/wire2str.h ub_loop.lo ub_loop.o: $(srcdir)/ub_loop.c $(srcdir)/ub_loop.h \ - config.h \ - getdns/getdns.h \ - getdns/getdns_extra.h \ - $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/debug.h + config.h util-internal.lo util-internal.o: $(srcdir)/util-internal.c \ config.h \ - getdns/getdns.h \ - $(srcdir)/dict.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/types-internal.h \ - getdns/getdns_extra.h \ - $(srcdir)/list.h $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ - $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h \ + getdns/getdns.h $(srcdir)/dict.h \ + $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/types-internal.h \ + getdns/getdns_extra.h $(srcdir)/list.h \ + $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ + $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h \ $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/str2wire.h \ $(srcdir)/gldns/rrdef.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h gbuffer.lo gbuffer.o: $(srcdir)/gldns/gbuffer.c \ - config.h \ - $(srcdir)/gldns/gbuffer.h + config.h $(srcdir)/gldns/gbuffer.h keyraw.lo keyraw.o: $(srcdir)/gldns/keyraw.c \ - config.h \ - $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/rrdef.h + config.h $(srcdir)/gldns/keyraw.h \ + $(srcdir)/gldns/rrdef.h parse.lo parse.o: $(srcdir)/gldns/parse.c \ - config.h \ - $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h + config.h $(srcdir)/gldns/parse.h \ + $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h parseutil.lo parseutil.o: $(srcdir)/gldns/parseutil.c \ - config.h \ - $(srcdir)/gldns/parseutil.h + config.h $(srcdir)/gldns/parseutil.h rrdef.lo rrdef.o: $(srcdir)/gldns/rrdef.c \ - config.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h + config.h $(srcdir)/gldns/rrdef.h \ + $(srcdir)/gldns/parseutil.h str2wire.lo str2wire.o: $(srcdir)/gldns/str2wire.c \ - config.h \ - $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h + config.h $(srcdir)/gldns/str2wire.h \ + $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/parse.h \ + $(srcdir)/gldns/parseutil.h wire2str.lo wire2str.o: $(srcdir)/gldns/wire2str.c \ - config.h \ - $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h \ - $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/keyraw.h + config.h $(srcdir)/gldns/wire2str.h \ + $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/parseutil.h \ + $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/keyraw.h arc4_lock.lo arc4_lock.o: $(srcdir)/compat/arc4_lock.c \ config.h arc4random.lo arc4random.o: $(srcdir)/compat/arc4random.c \ @@ -527,8 +507,7 @@ strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c \ config.h strptime.lo strptime.o: $(srcdir)/compat/strptime.c \ config.h -locks.lo locks.o: $(srcdir)/util/locks.c \ - config.h \ +locks.lo locks.o: $(srcdir)/util/locks.c config.h \ $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h lookup3.lo lookup3.o: $(srcdir)/util/lookup3.c \ config.h \ @@ -540,10 +519,10 @@ lruhash.lo lruhash.o: $(srcdir)/util/lruhash.c \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util/auxiliary/util/fptr_wlist.h rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c \ - config.h \ - $(srcdir)/util/auxiliary/log.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h \ - $(srcdir)/util/auxiliary/fptr_wlist.h $(srcdir)/util/auxiliary/util/fptr_wlist.h \ - $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h + config.h $(srcdir)/util/auxiliary/log.h \ + $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util/auxiliary/fptr_wlist.h \ + $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/rbtree.h \ + $(srcdir)/util/orig-headers/rbtree.h val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c \ config.h \ $(srcdir)/util/auxiliary/util/data/packed_rrset.h \ @@ -555,37 +534,41 @@ val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c \ jsmn.lo jsmn.o: $(srcdir)/jsmn/jsmn.c $(srcdir)/jsmn/jsmn.h yxml.lo yxml.o: $(srcdir)/yxml/yxml.c $(srcdir)/yxml/yxml.h libev.lo libev.o: $(srcdir)/extension/libev.c \ - config.h \ - $(srcdir)/types-internal.h \ + config.h $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libev.h libevent.lo libevent.o: $(srcdir)/extension/libevent.c \ - config.h \ - $(srcdir)/types-internal.h \ + config.h $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libevent.h libuv.lo libuv.o: $(srcdir)/extension/libuv.c \ - config.h \ - $(srcdir)/debug.h $(srcdir)/types-internal.h \ + config.h $(srcdir)/debug.h \ + $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libuv.h poll_eventloop.lo poll_eventloop.o: $(srcdir)/extension/poll_eventloop.c \ - config.h \ - $(srcdir)/extension/poll_eventloop.h \ - getdns/getdns.h \ + config.h $(srcdir)/util-internal.h \ + $(srcdir)/context.h getdns/getdns.h \ getdns/getdns_extra.h \ - $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/debug.h + $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ + $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ + $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/platform.h select_eventloop.lo select_eventloop.o: $(srcdir)/extension/select_eventloop.c \ - config.h \ - $(srcdir)/debug.h $(srcdir)/types-internal.h \ + config.h $(srcdir)/debug.h \ + $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ - $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/extension/select_eventloop.h + $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/platform.h \ + $(srcdir)/extension/select_eventloop.h stubby.lo stubby.o: $(stubbysrcdir)/src/stubby.c \ config.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h +version.lo version.o: $(stubbysrcdir)/src/version.c diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index 7d6bb99c..7cd80cd9 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -408,7 +408,7 @@ poll_eventloop_run_once(getdns_eventloop *loop, int blocking) } else #endif if (_getdns_poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { - perror("poll() failed"); + _getdns_perror("poll() failed"); exit(EXIT_FAILURE); } now = get_now_plus(0); diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 6f6d0f75..0350f1d5 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -29,6 +29,7 @@ #include "debug.h" #include "types-internal.h" +#include "platform.h" #include "extension/select_eventloop.h" static uint64_t get_now_plus(uint64_t amount) @@ -244,7 +245,7 @@ select_eventloop_run_once(getdns_eventloop *loop, int blocking) #endif if (select(max_fd + 1, &readfds, &writefds, NULL, (timeout == TIMEOUT_FOREVER ? NULL : &tv)) < 0) { - perror("select() failed"); + _getdns_perror("select() failed"); exit(EXIT_FAILURE); } #ifdef USE_WINSOCK diff --git a/src/platform.c b/src/platform.c new file mode 100644 index 00000000..61f2bdb6 --- /dev/null +++ b/src/platform.c @@ -0,0 +1,69 @@ +/** + * + * \file platform.c + * @brief general functions with platform-dependent implementations + * + */ + +/* + * Copyright (c) 2017, NLnet Labs, Sinodun + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the names of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform.h" + +#include + +#ifdef USE_WINSOCK + +void _getdns_perror(const char *str) +{ + char msg[256]; + int errid = WSAGetLastError(); + + *msg = '\0'; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + errid, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + msg, + sizeof(msg), + NULL); + if (*msg == '\0') + sprintf(msg, "Unknown error: %d", errid); + if (str && *str != '\0') + fprintf(stderr, "%s: ", str); + fputs(msg, stderr); +} + +#else + +void _getdns_perror(const char *str) +{ + perror(str); +} + +#endif diff --git a/src/platform.h b/src/platform.h index 0cd4c9f6..e0ec5454 100644 --- a/src/platform.h +++ b/src/platform.h @@ -1,6 +1,7 @@ /** * - * /brief general functions with platform-dependent implementations + * \file platform.h + * @brief general functions with platform-dependent implementations * */ @@ -78,4 +79,6 @@ typedef u_short sa_family_t; #define _getdns_socketerror() (errno) #endif +void _getdns_perror(const char *str); + #endif From 968d94d2bed26e4d93ac5664d932ed3e9bace898 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 16 Oct 2017 14:17:49 +0200 Subject: [PATCH 19/59] atomic netreq removal from write_queue in upstream_write_cb --- src/stub.c | 54 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/stub.c b/src/stub.c index ebcb2527..cf63e3de 100644 --- a/src/stub.c +++ b/src/stub.c @@ -462,6 +462,36 @@ stub_next_upstream(getdns_network_req *netreq) dnsreq->upstreams->current_udp = 0; } +static void +remove_from_write_queue(getdns_upstream *upstream, getdns_network_req * netreq) +{ + getdns_network_req *r, *prev_r; + + for ( r = upstream->write_queue, prev_r = NULL + ; r + ; prev_r = r, r = r->write_queue_tail) { + + if (r != netreq) + continue; + + if (prev_r) + prev_r->write_queue_tail = r->write_queue_tail; + else + upstream->write_queue = r->write_queue_tail; + + if (r == upstream->write_queue_last) { + /* If r was the last netreq, + * its write_queue tail MUST be NULL + */ + assert(r->write_queue_tail == NULL); + upstream->write_queue_last = prev_r ? prev_r : NULL; + } + + netreq->write_queue_tail = NULL; + break; /* netreq found and removed */ + } +} + static void stub_cleanup(getdns_network_req *netreq) { @@ -481,22 +511,7 @@ stub_cleanup(getdns_network_req *netreq) (void) _getdns_rbtree_delete(&upstream->netreq_by_query_id, (void *)(intptr_t)GLDNS_ID_WIRE(netreq->query)); - /* Delete from upstream->write_queue (if present) */ - for (prev_r = NULL, r = upstream->write_queue; r; - prev_r = r, r = r->write_queue_tail) - - if (r == netreq) { - if (prev_r) - prev_r->write_queue_tail = r->write_queue_tail; - else - upstream->write_queue = r->write_queue_tail; - - if (r == upstream->write_queue_last) - upstream->write_queue_last = - prev_r ? prev_r : NULL; - netreq->write_queue_tail = NULL; - break; - } + remove_from_write_queue(upstream, netreq); upstream_reschedule_events(upstream, upstream->keepalive_timeout); } @@ -1706,8 +1721,11 @@ upstream_write_cb(void *userarg) upstream->queries_sent++; /* Unqueue the netreq from the write_queue */ - if (!(upstream->write_queue = netreq->write_queue_tail)) { - upstream->write_queue_last = NULL; + remove_from_write_queue(upstream, netreq); + + /* Empty write_queue?, then deschedule upstream write_cb */ + if (upstream->write_queue == NULL) { + assert(upstream->write_queue_last == NULL); GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); upstream->event.write_cb = NULL; /* Reschedule (if already reading) to clear writable */ From ce4c44830d0587dd129b2c7a3e990ef9968177da Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 16 Oct 2017 15:26:00 +0200 Subject: [PATCH 20/59] Unused variables --- src/stub.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stub.c b/src/stub.c index cf63e3de..46f0056a 100644 --- a/src/stub.c +++ b/src/stub.c @@ -498,7 +498,6 @@ stub_cleanup(getdns_network_req *netreq) DEBUG_STUB("%s %-35s: MSG: %p\n", STUB_DEBUG_CLEANUP, __FUNC__, (void*)netreq); getdns_dns_req *dnsreq = netreq->owner; - getdns_network_req *r, *prev_r; getdns_upstream *upstream; GETDNS_CLEAR_EVENT(dnsreq->loop, &netreq->event); From 11e4635f2be0bb0c74b6a347f31e1b7ecd293aaf Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 13:32:41 +0200 Subject: [PATCH 21/59] Dependencies --- src/Makefile.in | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Makefile.in b/src/Makefile.in index f77b7447..f20a7a90 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -293,7 +293,7 @@ anchor.lo anchor.o: $(srcdir)/anchor.c \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h $(srcdir)/yxml/yxml.h \ $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h \ - $(srcdir)/gldns/keyraw.h $(srcdir)/general.h $(srcdir)/util-internal.h + $(srcdir)/gldns/keyraw.h $(srcdir)/general.h $(srcdir)/util-internal.h $(srcdir)/platform.h const-info.lo const-info.o: $(srcdir)/const-info.c \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -309,8 +309,8 @@ context.lo context.o: $(srcdir)/context.c \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ - $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h \ - $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h $(srcdir)/pubkey-pinning.h + $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util-internal.h $(srcdir)/platform.h $(srcdir)/dnssec.h \ + $(srcdir)/gldns/rrdef.h $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h $(srcdir)/pubkey-pinning.h convert.lo convert.o: $(srcdir)/convert.c \ config.h \ getdns/getdns.h \ @@ -362,7 +362,7 @@ general.lo general.o: $(srcdir)/general.c \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h $(srcdir)/stub.h \ - $(srcdir)/dict.h $(srcdir)/mdns.h + $(srcdir)/dict.h $(srcdir)/mdns.h $(srcdir)/platform.h list.lo list.o: $(srcdir)/list.c $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -383,8 +383,8 @@ mdns.lo mdns.o: $(srcdir)/mdns.c \ $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/gldns/rrdef.h $(srcdir)/util-internal.h $(srcdir)/mdns.h \ - $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/lookup3.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/gldns/rrdef.h $(srcdir)/util-internal.h \ + $(srcdir)/platform.h $(srcdir)/mdns.h $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/lookup3.h \ $(srcdir)/util/orig-headers/lookup3.h pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c \ config.h \ @@ -434,7 +434,7 @@ server.lo server.o: $(srcdir)/server.c \ $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h $(srcdir)/platform.h stub.lo stub.o: $(srcdir)/stub.c \ config.h \ $(srcdir)/debug.h $(srcdir)/stub.h \ @@ -447,7 +447,7 @@ stub.lo stub.o: $(srcdir)/stub.c \ $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/anchor.h \ - $(srcdir)/util-internal.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h + $(srcdir)/util-internal.h $(srcdir)/platform.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h sync.lo sync.o: $(srcdir)/sync.c \ getdns/getdns.h \ config.h \ @@ -574,10 +574,15 @@ libuv.lo libuv.o: $(srcdir)/extension/libuv.c \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libuv.h poll_eventloop.lo poll_eventloop.o: $(srcdir)/extension/poll_eventloop.c \ config.h \ - $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/util-internal.h $(srcdir)/context.h \ getdns/getdns.h \ getdns/getdns_extra.h \ - $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/debug.h + $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ + $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ + $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/platform.h select_eventloop.lo select_eventloop.o: $(srcdir)/extension/select_eventloop.c \ config.h \ $(srcdir)/debug.h $(srcdir)/types-internal.h \ From ee4feb0cc68ed32f666c100f0bc6ad6259565d44 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 13:32:56 +0200 Subject: [PATCH 22/59] Clean parallel builds too --- src/test/tpkg/clean.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/tpkg/clean.sh b/src/test/tpkg/clean.sh index 60e4ef42..a405d5b0 100755 --- a/src/test/tpkg/clean.sh +++ b/src/test/tpkg/clean.sh @@ -3,5 +3,5 @@ export SRCDIR=`dirname $0` ( cd $SRCDIR ./tpkg clean - rm -fr build build-stub-only build-event-loops build-static-analysis install scan-build-reports .tpkg.var.master *.info + rm -fr build build-stub-only build-event-loops build-static-analysis install scan-build-reports .tpkg.var.master *.info Makefile ) From f83c8e217e38ff3052f9b966dc12b41593697dd8 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 13:47:29 +0200 Subject: [PATCH 23/59] Decrease assumptions based on network_by_query_id --- src/request-internal.c | 17 ++++++ src/stub.c | 119 +++++++++++++++++------------------------ src/types-internal.h | 4 +- 3 files changed, 68 insertions(+), 72 deletions(-) diff --git a/src/request-internal.c b/src/request-internal.c index 26bd3df2..c9f27db0 100644 --- a/src/request-internal.c +++ b/src/request-internal.c @@ -107,6 +107,12 @@ network_req_cleanup(getdns_network_req *net_req) { assert(net_req); + if (net_req->query_id_registered) { + (void) _getdns_rbtree_delete( + net_req->query_id_registered, net_req->node.key); + net_req->query_id_registered = NULL; + net_req->node.key = NULL; + } if (net_req->response && (net_req->response < net_req->wire_data || net_req->response > net_req->wire_data+ net_req->wire_data_sz)) GETDNS_FREE(net_req->owner->my_mf, net_req->response); @@ -123,6 +129,12 @@ netreq_reset(getdns_network_req *net_req) */ net_req->unbound_id = -1; _getdns_netreq_change_state(net_req, NET_REQ_NOT_SENT); + if (net_req->query_id_registered) { + (void) _getdns_rbtree_delete(net_req->query_id_registered, + (void *)(intptr_t)GLDNS_ID_WIRE(net_req->query)); + net_req->query_id_registered = NULL; + net_req->node.key = NULL; + } net_req->dnssec_status = GETDNS_DNSSEC_INDETERMINATE; net_req->tsig_status = GETDNS_DNSSEC_INDETERMINATE; net_req->response_len = 0; @@ -196,6 +208,11 @@ network_req_init(getdns_network_req *net_req, getdns_dns_req *owner, /* Scheduling, touch only via _getdns_netreq_change_state! */ net_req->state = NET_REQ_NOT_SENT; + /* A registered netreq (on a statefull transport) + * Deregister on reset and cleanup. + */ + net_req->query_id_registered = NULL; + net_req->node.key = NULL; if (max_query_sz == 0) { net_req->query = NULL; diff --git a/src/stub.c b/src/stub.c index 46f0056a..31bfb786 100644 --- a/src/stub.c +++ b/src/stub.c @@ -83,8 +83,7 @@ static void upstream_write_cb(void *userarg); static void upstream_idle_timeout_cb(void *userarg); static void upstream_schedule_netreq(getdns_upstream *upstream, getdns_network_req *netreq); -static void upstream_reschedule_events(getdns_upstream *upstream, - uint64_t idle_timeout); +static void upstream_reschedule_events(getdns_upstream *upstream); static int upstream_working_ok(getdns_upstream *upstream); static int upstream_auth_status_ok(getdns_upstream *upstream, getdns_network_req *netreq); @@ -498,20 +497,20 @@ stub_cleanup(getdns_network_req *netreq) DEBUG_STUB("%s %-35s: MSG: %p\n", STUB_DEBUG_CLEANUP, __FUNC__, (void*)netreq); getdns_dns_req *dnsreq = netreq->owner; - getdns_upstream *upstream; GETDNS_CLEAR_EVENT(dnsreq->loop, &netreq->event); - /* Nothing globally scheduled? Then nothing queued */ - if (!netreq->upstream || !(upstream = netreq->upstream)->event.ev) - return; - - /* Delete from upstream->netreq_by_query_id (if present) */ - (void) _getdns_rbtree_delete(&upstream->netreq_by_query_id, - (void *)(intptr_t)GLDNS_ID_WIRE(netreq->query)); - - remove_from_write_queue(upstream, netreq); - upstream_reschedule_events(upstream, upstream->keepalive_timeout); + if (netreq->query_id_registered) { + (void) _getdns_rbtree_delete( + netreq->query_id_registered, netreq->node.key); + netreq->query_id_registered = NULL; + netreq->node.key = NULL; + } + if (netreq->upstream) { + remove_from_write_queue(netreq->upstream, netreq); + if (netreq->upstream->event.ev) + upstream_reschedule_events(netreq->upstream); + } } static void @@ -528,14 +527,6 @@ upstream_failed(getdns_upstream *upstream, int during_setup) if (during_setup) { /* Reset timeout on setup failure to trigger fallback handling.*/ GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); - /* Need this check because if the setup failed because the interface is - not up we get -1 and then a seg fault. Found when using IPv6 address - but IPv6 interface not enabled.*/ - if (upstream->fd != -1) { - GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, TIMEOUT_FOREVER, - getdns_eventloop_event_init(&upstream->event, upstream, - NULL, upstream_write_cb, NULL)); - } /* Special case if failure was due to authentication issues since this upstream could be used oppotunistically with no problem.*/ if (!(upstream->transport == GETDNS_TRANSPORT_TLS && @@ -545,6 +536,14 @@ upstream_failed(getdns_upstream *upstream, int during_setup) upstream->conn_shutdowns++; /* [TLS1]TODO: Re-try these queries if possible.*/ } + upstream->conn_state = GETDNS_CONN_TEARDOWN; + + if (upstream->write_queue) { + if (!during_setup) + during_setup = -1; + while (upstream->write_queue) + upstream_write_cb(upstream); + } while (upstream->netreq_by_query_id.count) { netreq = (getdns_network_req *) _getdns_rbtree_first(&upstream->netreq_by_query_id); @@ -552,7 +551,13 @@ upstream_failed(getdns_upstream *upstream, int during_setup) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); } - upstream->conn_state = GETDNS_CONN_TEARDOWN; + if (during_setup == 0) + return; + + else if (during_setup > 0) + _getdns_upstream_reset(upstream); + else + _getdns_upstream_shutdown(upstream); } void @@ -613,42 +618,12 @@ upstream_idle_timeout_cb(void *userarg) static void upstream_setup_timeout_cb(void *userarg) { - int ret; getdns_upstream *upstream = (getdns_upstream *)userarg; -#ifdef USE_POLL_DEFAULT_EVENTLOOP - struct pollfd fds; -#else - fd_set fds; - struct timeval tval; -#endif DEBUG_STUB("%s %-35s: FD: %d\n", STUB_DEBUG_CLEANUP, __FUNC__, upstream->fd); - /* Clean up and trigger a write to let the fallback code to its job */ - upstream_failed(upstream, 1); - /* Need to handle the case where the far end doesn't respond to a - * TCP SYN and doesn't do a reset (as is the case with e.g. 8.8.8.8@853). - * For that case the socket never becomes writable so doesn't trigger any - * callbacks. If so then clear out the queue in one go.*/ -#ifdef USE_POLL_DEFAULT_EVENTLOOP - fds.fd = upstream->fd; - fds.events = POLLOUT; - ret = _getdns_poll(&fds, 1, 0); -#else - FD_ZERO(&fds); - FD_SET((int)(upstream->fd), &fds); - tval.tv_sec = 0; - tval.tv_usec = 0; - ret = select(upstream->fd+1, NULL, &fds, NULL, &tval); -#endif - if (ret == 0) { - DEBUG_STUB("%s %-35s: FD: %d Cleaning up dangling queue\n", - STUB_DEBUG_CLEANUP, __FUNC__, upstream->fd); - while (upstream->write_queue) - upstream_write_cb(upstream); - } - _getdns_upstream_reset(upstream); + upstream_failed(upstream, 1); } @@ -748,6 +723,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) } while (!_getdns_rbtree_insert( &netreq->upstream->netreq_by_query_id, &netreq->node)); + netreq->query_id_registered = &netreq->upstream->netreq_by_query_id; GLDNS_ID_SET(netreq->query, query_id); @@ -1241,6 +1217,7 @@ stub_tls_write(getdns_upstream *upstream, getdns_tcp_state *tcp, } while (!_getdns_rbtree_insert( &netreq->upstream->netreq_by_query_id, &netreq->node)); + netreq->query_id_registered = &netreq->upstream->netreq_by_query_id; GLDNS_ID_SET(netreq->query, query_id); @@ -1555,12 +1532,9 @@ upstream_read_cb(void *userarg) case STUB_SETUP_ERROR: /* Can happen for TLS HS*/ case STUB_TCP_ERROR: upstream_failed(upstream, (q == STUB_TCP_ERROR ? 0:1) ); - if (!upstream->write_queue) - _getdns_upstream_shutdown(upstream); return; default: - /* Lookup netreq */ query_id = (uint16_t) q; query_id_intptr = (intptr_t) query_id; @@ -1572,7 +1546,16 @@ upstream_read_cb(void *userarg) upstream->tcp.to_read = 2; return; } + if (netreq->query_id_registered == &upstream->netreq_by_query_id) { + netreq->query_id_registered = NULL; + netreq->node.key = NULL; + } else if (netreq->query_id_registered) { + (void) _getdns_rbtree_delete( + netreq->query_id_registered, netreq->node.key); + netreq->query_id_registered = NULL; + netreq->node.key = NULL; + } DEBUG_STUB("%s %-35s: MSG: %p (read)\n", STUB_DEBUG_READ, __FUNC__, (void*)netreq); _getdns_netreq_change_state(netreq, NET_REQ_FINISHED); @@ -1685,10 +1668,8 @@ upstream_write_cb(void *userarg) /* Could not complete the set up. Need to fallback.*/ DEBUG_STUB("%s %-35s: Upstream: %p ERROR = %d\n", STUB_DEBUG_WRITE, __FUNC__, (void*)userarg, q); - (void) _getdns_rbtree_delete(&upstream->netreq_by_query_id, - (void *)(intptr_t)GLDNS_ID_WIRE(netreq->query)); upstream_failed(upstream, (q == STUB_TCP_ERROR ? 0:1)); - /* Fall through */ + return; case STUB_CONN_GONE: case STUB_NO_AUTH: /* Cleaning up after connection or auth check failure. Need to fallback. */ @@ -1702,11 +1683,12 @@ upstream_write_cb(void *userarg) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); } - if (!upstream->write_queue) - _getdns_upstream_shutdown(upstream); return; default: + /* Unqueue the netreq from the write_queue */ + remove_from_write_queue(upstream, netreq); + if (netreq->owner->return_call_reporting && netreq->upstream->tls_obj && netreq->debug_tls_peer_cert.data == NULL && @@ -1719,9 +1701,6 @@ upstream_write_cb(void *userarg) netreq->debug_tls_auth_status = netreq->upstream->tls_auth_state; upstream->queries_sent++; - /* Unqueue the netreq from the write_queue */ - remove_from_write_queue(upstream, netreq); - /* Empty write_queue?, then deschedule upstream write_cb */ if (upstream->write_queue == NULL) { assert(upstream->write_queue_last == NULL); @@ -2015,7 +1994,6 @@ upstream_connect(getdns_upstream *upstream, getdns_transport_list_t transport, fd = tcp_connect(upstream, transport); if (fd == -1) { upstream_failed(upstream, 1); - _getdns_upstream_reset(upstream); return -1; } upstream->loop = dnsreq->loop; @@ -2025,7 +2003,6 @@ upstream_connect(getdns_upstream *upstream, getdns_transport_list_t transport, upstream->tls_obj = tls_create_object(dnsreq, fd, upstream); if (upstream->tls_obj == NULL) { upstream_failed(upstream, 1); - _getdns_upstream_reset(upstream); _getdns_closesocket(fd); return -1; } @@ -2137,7 +2114,7 @@ fallback_on_write(getdns_network_req *netreq) } static void -upstream_reschedule_events(getdns_upstream *upstream, uint64_t idle_timeout) { +upstream_reschedule_events(getdns_upstream *upstream) { DEBUG_STUB("%s %-35s: FD: %d \n", STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd); @@ -2159,7 +2136,8 @@ upstream_reschedule_events(getdns_upstream *upstream, uint64_t idle_timeout) { upstream->fd, TIMEOUT_FOREVER, &upstream->event); else { DEBUG_STUB("%s %-35s: FD: %d Connection idle - timeout is %d\n", - STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd, (int)idle_timeout); + STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd, + (int)upstream->keepalive_timeout); /* TODO: Schedule a read also anyway, * to digest timed out answers. * Dont forget to schedule with upstream->fd then! @@ -2167,10 +2145,9 @@ upstream_reschedule_events(getdns_upstream *upstream, uint64_t idle_timeout) { * upstream->event.read_cb = upstream_read_cb; */ upstream->event.timeout_cb = upstream_idle_timeout_cb; - if (upstream->conn_state != GETDNS_CONN_OPEN) - idle_timeout = 0; GETDNS_SCHEDULE_EVENT(upstream->loop, -1, - idle_timeout, &upstream->event); + ( upstream->conn_state == GETDNS_CONN_OPEN + ? upstream->keepalive_timeout : 0), &upstream->event); } } diff --git a/src/types-internal.h b/src/types-internal.h index 56b7a2f0..05589f4a 100644 --- a/src/types-internal.h +++ b/src/types-internal.h @@ -188,7 +188,9 @@ typedef struct getdns_tcp_state { typedef struct getdns_network_req { /* For storage in upstream->netreq_by_query_id */ - _getdns_rbnode_t node; + _getdns_rbnode_t node; + /* The netreq_by_query_id tree in which this netreq was registered */ + _getdns_rbtree_t *query_id_registered; #ifdef HAVE_MDNS_SUPPORT /* * for storage of continuous query context in hash table of cached results. From dc5a78b154183d42148277d8d7fd55f84d4c111c Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 14:19:59 +0200 Subject: [PATCH 24/59] Printing something which is not on stack (causing segfault in some cases) --- src/stub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stub.c b/src/stub.c index 31bfb786..5eb1705a 100644 --- a/src/stub.c +++ b/src/stub.c @@ -1907,8 +1907,8 @@ upstream_select_stateful(getdns_network_req *netreq, getdns_transport_list_t tra upstream->conn_state = GETDNS_CONN_CLOSED; upstream->conn_backoff_interval = 1; _getdns_upstream_log(upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_NOTICE, - "%-40s : No valid upstreams... promoting backed-off upstream %s for re-try...\n", - upstreams->upstreams[i].addr_str); + "%-40s : No valid upstreams... promoting this backed-off upstream for re-try...\n", + upstream->addr_str); return upstream; } From fa597399e2d214685163d025809c67245769dd37 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 15:14:09 +0200 Subject: [PATCH 25/59] Update stubby --- stubby | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubby b/stubby index d541e605..c9e89293 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit d541e60530717f590d4a4a9d458f987cbe90fc59 +Subproject commit c9e89293beac4fe599024bfb021cb2ae832cc93f From eedd1a14482393505e2dfc1c0f6b80f76d851b5d Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 17 Oct 2017 16:58:01 +0200 Subject: [PATCH 26/59] Eat incoming garbage on statefull transports Can deal with timed out queries that are answered anyway. + reset the upstream on failure always (since requests are rescheduled for fallback by upstream_failed now anyway) --- src/context.c | 15 +++++++++++---- src/stub.c | 26 ++++++++++++-------------- src/sync.c | 34 ++++++++++++++-------------------- src/tools/getdns_query.c | 17 ++++++++++++----- 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/context.c b/src/context.c index 3456bfa0..ccbb52a1 100644 --- a/src/context.c +++ b/src/context.c @@ -800,6 +800,10 @@ _getdns_upstream_reset(getdns_upstream *upstream) /* Now TLS stuff*/ upstream->tls_auth_state = GETDNS_AUTH_NONE; + if (upstream->event.ev && upstream->loop) { + upstream->loop->vmt->clear( + upstream->loop, &upstream->event); + } if (upstream->tls_obj != NULL) { SSL_shutdown(upstream->tls_obj); SSL_free(upstream->tls_obj); @@ -2769,11 +2773,14 @@ getdns_context_set_upstream_recursive_servers(struct getdns_context *context, struct addrinfo hints; RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER); - RETURN_IF_NULL(upstream_list, GETDNS_RETURN_INVALID_PARAMETER); - r = getdns_list_get_length(upstream_list, &count); - if (count == 0 || r != GETDNS_RETURN_GOOD) { - return GETDNS_RETURN_CONTEXT_UPDATE_FAIL; + if ( !upstream_list + || (r = getdns_list_get_length(upstream_list, &count)) + || count == 0) { + _getdns_upstreams_dereference(context->upstreams); + context->upstreams = NULL; + dispatch_updated(context, + GETDNS_CONTEXT_CODE_UPSTREAM_RECURSIVE_SERVERS); } memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ diff --git a/src/stub.c b/src/stub.c index 5eb1705a..fda8df8f 100644 --- a/src/stub.c +++ b/src/stub.c @@ -551,10 +551,7 @@ upstream_failed(getdns_upstream *upstream, int during_setup) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); } - if (during_setup == 0) - return; - - else if (during_setup > 0) + if (during_setup > 0) _getdns_upstream_reset(upstream); else _getdns_upstream_shutdown(upstream); @@ -2118,7 +2115,13 @@ upstream_reschedule_events(getdns_upstream *upstream) { DEBUG_STUB("%s %-35s: FD: %d \n", STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd); - GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); + if (upstream->event.ev) + GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); + + if (upstream->fd == -1 || !( upstream->conn_state == GETDNS_CONN_SETUP + || upstream->conn_state == GETDNS_CONN_OPEN )) + return; + if (!upstream->write_queue && upstream->event.write_cb) { upstream->event.write_cb = NULL; } @@ -2138,16 +2141,11 @@ upstream_reschedule_events(getdns_upstream *upstream) { DEBUG_STUB("%s %-35s: FD: %d Connection idle - timeout is %d\n", STUB_DEBUG_SCHEDULE, __FUNC__, upstream->fd, (int)upstream->keepalive_timeout); - /* TODO: Schedule a read also anyway, - * to digest timed out answers. - * Dont forget to schedule with upstream->fd then! - * - * upstream->event.read_cb = upstream_read_cb; - */ + + upstream->event.read_cb = upstream_read_cb; upstream->event.timeout_cb = upstream_idle_timeout_cb; - GETDNS_SCHEDULE_EVENT(upstream->loop, -1, - ( upstream->conn_state == GETDNS_CONN_OPEN - ? upstream->keepalive_timeout : 0), &upstream->event); + GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, + upstream->keepalive_timeout, &upstream->event); } } diff --git a/src/sync.c b/src/sync.c index c618b0e4..debf904b 100644 --- a/src/sync.c +++ b/src/sync.c @@ -116,30 +116,24 @@ getdns_sync_data_cleanup(getdns_sync_data *data) upstream = &ctxt->upstreams->upstreams[i]; if (upstream->loop != &data->context->sync_eventloop.loop) continue; - if (upstream->event.read_cb || upstream->event.write_cb) { - GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); - - } else if (upstream->event.timeout_cb) { - /* Timeout's at upstream are idle-timeouts only. - * They should be fired on completion of the - * synchronous request. - */ - GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); - if (upstream->conn_state != GETDNS_CONN_OPEN || - upstream->keepalive_timeout == 0) - (*upstream->event.timeout_cb)(upstream->event.userarg); + GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); + if (upstream->event.timeout_cb && + ( upstream->conn_state != GETDNS_CONN_OPEN + || upstream->keepalive_timeout == 0)) { + (*upstream->event.timeout_cb)(upstream->event.userarg); + upstream->event.timeout_cb = NULL; } upstream->loop = data->context->extension; upstream->is_sync_loop = 0; - if (upstream->event.read_cb || upstream->event.write_cb) - GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, - TIMEOUT_FOREVER, &upstream->event); - else if (upstream->event.timeout_cb && - upstream->conn_state == GETDNS_CONN_OPEN && - upstream->keepalive_timeout != 0) { - GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, - upstream->keepalive_timeout, &upstream->event); + if ( upstream->event.read_cb || upstream->event.write_cb + || upstream->event.timeout_cb) { + GETDNS_SCHEDULE_EVENT(upstream->loop, + ( upstream->event.read_cb + || upstream->event.write_cb ? upstream->fd : -1), + ( upstream->event.timeout_cb + ? upstream->keepalive_timeout : TIMEOUT_FOREVER ), + &upstream->event); } } } diff --git a/src/tools/getdns_query.c b/src/tools/getdns_query.c index eff84136..b886ae59 100644 --- a/src/tools/getdns_query.c +++ b/src/tools/getdns_query.c @@ -1279,7 +1279,8 @@ void read_line_cb(void *userarg) if (listen_count) (void) getdns_context_set_listen_addresses( context, NULL, NULL, NULL); - (void) getdns_context_set_idle_timeout(context, 0); + (void) getdns_context_set_upstream_recursive_servers( + context, NULL); return; } if (query_file && verbosity) @@ -1678,16 +1679,22 @@ static void stubby_log(void *userarg, uint64_t system, #ifdef GETDNS_ON_WINDOWS time_t tsec; + if (!verbosity) + return; + gettimeofday(&tv, NULL); tsec = (time_t) tv.tv_sec; gmtime_s(&tm, (const time_t *) &tsec); #else + if (!verbosity) + return; + gettimeofday(&tv, NULL); gmtime_r(&tv.tv_sec, &tm); #endif strftime(buf, 10, "%H:%M:%S", &tm); (void)userarg; (void)system; (void)level; - (void) fprintf(stderr, "[%s.%.6d] STUBBY: ", buf, (int)tv.tv_usec); + (void) fprintf(stderr, "[%s.%.6d] UPSTREAM ", buf, (int)tv.tv_usec); (void) vfprintf(stderr, fmt, ap); } @@ -1741,10 +1748,10 @@ main(int argc, char **argv) (void) parse_config_file(home_stubby_conf_fn, 0); } clear_listen_list_on_arg = 1; - - (void) getdns_context_set_logfunc(context, NULL, - GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_DEBUG, stubby_log); } + (void) getdns_context_set_logfunc(context, NULL, + GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_DEBUG, stubby_log); + if ((r = parse_args(argc, argv))) goto done_destroy_context; clear_listen_list_on_arg = 0; From 87879783ec9d348698903f7ad02109c424ade752 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Wed, 18 Oct 2017 14:33:59 +0200 Subject: [PATCH 27/59] Postpone dealing with upstream derenferencing issue --- src/tools/getdns_query.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tools/getdns_query.c b/src/tools/getdns_query.c index b886ae59..53e546e2 100644 --- a/src/tools/getdns_query.c +++ b/src/tools/getdns_query.c @@ -1279,8 +1279,9 @@ void read_line_cb(void *userarg) if (listen_count) (void) getdns_context_set_listen_addresses( context, NULL, NULL, NULL); - (void) getdns_context_set_upstream_recursive_servers( - context, NULL); + if (interactive && !query_file) + (void) getdns_context_set_upstream_recursive_servers( + context, NULL); return; } if (query_file && verbosity) From 8886c5317dc18576e9dec8928ccda1b499d73bcb Mon Sep 17 00:00:00 2001 From: Sara Dickinson Date: Thu, 19 Oct 2017 10:36:46 +0100 Subject: [PATCH 28/59] Fix 2 bugs: - backoff time was not incrementing correctly - best authentication information state was not being kept for shutdowns during setup (needed if e.g. hostname authentication failed during handshake). --- src/context.c | 3 ++- src/stub.c | 11 +++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/context.c b/src/context.c index ccbb52a1..01688105 100644 --- a/src/context.c +++ b/src/context.c @@ -754,8 +754,9 @@ upstream_backoff(getdns_upstream *upstream) { upstream->conn_shutdowns = 0; upstream->conn_backoffs++; _getdns_upstream_log(upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_NOTICE, - "%-40s : !Backing off this upstream - Will retry again at %s", + "%-40s : !Backing off this upstream - Will retry again in %ds at %s", upstream->addr_str, + upstream->conn_backoff_interval, asctime(gmtime(&upstream->conn_retry_time))); } diff --git a/src/stub.c b/src/stub.c index fda8df8f..3a114712 100644 --- a/src/stub.c +++ b/src/stub.c @@ -551,10 +551,7 @@ upstream_failed(getdns_upstream *upstream, int during_setup) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); } - if (during_setup > 0) - _getdns_upstream_reset(upstream); - else - _getdns_upstream_shutdown(upstream); + _getdns_upstream_shutdown(upstream); } void @@ -957,8 +954,11 @@ tls_create_object(getdns_dns_req *dnsreq, int fd, getdns_upstream *upstream) X509_VERIFY_PARAM_set1_host(param, upstream->tls_auth_name, 0); #else if (dnsreq->netreqs[0]->tls_auth_min == GETDNS_AUTHENTICATION_REQUIRED) { - DEBUG_STUB("%s %-35s: ERROR: TLS Authentication functionality not available\n", + DEBUG_STUB("%s %-35s: ERROR: Hostname Authentication not available from TLS library (check library version)\n", STUB_DEBUG_SETUP_TLS, __FUNC__); + _getdns_upstream_log(upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_ERR, + "%-40s : ERROR: Hostname Authentication not available from TLS library (check library version)\n", + upstream->addr_str); upstream->tls_hs_state = GETDNS_HS_FAILED; return NULL; } @@ -1843,7 +1843,6 @@ upstream_select_stateful(getdns_network_req *netreq, getdns_transport_list_t tra if (upstreams->upstreams[i].conn_state == GETDNS_CONN_BACKOFF && upstreams->upstreams[i].conn_retry_time < now) { upstreams->upstreams[i].conn_state = GETDNS_CONN_CLOSED; - upstreams->upstreams[i].conn_backoff_interval = 1; _getdns_upstream_log(upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_NOTICE, "%-40s : Re-instating upstream\n", upstreams->upstreams[i].addr_str); From 272d0cf0efbae3b03bd02e29bdf20bb0e5b2d550 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 19 Oct 2017 12:35:10 +0200 Subject: [PATCH 29/59] Allow clearing of upstreams --- src/test/check_getdns_context_set_upstream_recursive_servers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/check_getdns_context_set_upstream_recursive_servers.h b/src/test/check_getdns_context_set_upstream_recursive_servers.h index e1bb359f..85089e3c 100644 --- a/src/test/check_getdns_context_set_upstream_recursive_servers.h +++ b/src/test/check_getdns_context_set_upstream_recursive_servers.h @@ -65,7 +65,7 @@ CONTEXT_CREATE(TRUE); ASSERT_RC(getdns_context_set_upstream_recursive_servers(context, NULL), - GETDNS_RETURN_INVALID_PARAMETER, "Return code from getdns_context_set_upstream_recursive_servers()"); + GETDNS_RETURN_GOOD, "Return code from getdns_context_set_upstream_recursive_servers()"); CONTEXT_DESTROY; From f8e1ed78b8e249963d0d63becd84bb3a76709b6d Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 19 Oct 2017 12:48:58 +0200 Subject: [PATCH 30/59] Make upstream_reset static (and not shared between .c files) --- src/context.c | 4 ++-- src/context.h | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/context.c b/src/context.c index 01688105..994a9ac4 100644 --- a/src/context.c +++ b/src/context.c @@ -733,7 +733,7 @@ void _getdns_upstream_log(getdns_upstream *upstream, uint64_t system, va_end(args); } -void +static void upstream_backoff(getdns_upstream *upstream) { upstream->conn_state = GETDNS_CONN_BACKOFF; /* Increase the backoff interval incrementally up to the tls_backoff_time*/ @@ -760,7 +760,7 @@ upstream_backoff(getdns_upstream *upstream) { asctime(gmtime(&upstream->conn_retry_time))); } -void +static void _getdns_upstream_reset(getdns_upstream *upstream) { /* Back off connections that never got up service at all (probably no diff --git a/src/context.h b/src/context.h index 46f000c0..1a6d93a4 100644 --- a/src/context.h +++ b/src/context.h @@ -557,6 +557,4 @@ int _getdns_context_write_priv_file(getdns_context *context, int _getdns_context_can_write_appdata(getdns_context *context); -void _getdns_upstream_reset(getdns_upstream *upstream); - #endif /* _GETDNS_CONTEXT_H_ */ From fc073267f1d37f964a6f694eb2b640812ee91153 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 19 Oct 2017 14:14:37 +0200 Subject: [PATCH 31/59] Dead assignment --- src/stub.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/stub.c b/src/stub.c index 3a114712..49af9d8c 100644 --- a/src/stub.c +++ b/src/stub.c @@ -524,9 +524,8 @@ upstream_failed(getdns_upstream *upstream, int during_setup) when idle.*/ /* [TLS1]TODO: Work out how to re-open the connection and re-try the queries if there is only one upstream.*/ + GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); if (during_setup) { - /* Reset timeout on setup failure to trigger fallback handling.*/ - GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); /* Special case if failure was due to authentication issues since this upstream could be used oppotunistically with no problem.*/ if (!(upstream->transport == GETDNS_TRANSPORT_TLS && @@ -538,12 +537,9 @@ upstream_failed(getdns_upstream *upstream, int during_setup) } upstream->conn_state = GETDNS_CONN_TEARDOWN; - if (upstream->write_queue) { - if (!during_setup) - during_setup = -1; - while (upstream->write_queue) - upstream_write_cb(upstream); - } + while (upstream->write_queue) + upstream_write_cb(upstream); + while (upstream->netreq_by_query_id.count) { netreq = (getdns_network_req *) _getdns_rbtree_first(&upstream->netreq_by_query_id); From 971d876c70ec354c948d782a0414b3b83043d7a1 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 20 Oct 2017 15:59:42 +0200 Subject: [PATCH 32/59] Dependencies --- src/Makefile.in | 146 +++++++++++++++++++++++++++--------------------- 1 file changed, 83 insertions(+), 63 deletions(-) diff --git a/src/Makefile.in b/src/Makefile.in index a10d04c8..594f714b 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -281,7 +281,8 @@ depend: FORCE: # Dependencies for gldns, utils, the extensions and compat functions -anchor.lo anchor.o: $(srcdir)/anchor.c config.h \ +anchor.lo anchor.o: $(srcdir)/anchor.c \ + config.h \ $(srcdir)/debug.h $(srcdir)/anchor.h \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -297,8 +298,10 @@ const-info.lo const-info.o: $(srcdir)/const-info.c \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/const-info.h -context.lo context.o: $(srcdir)/context.c config.h \ - $(srcdir)/anchor.h getdns/getdns.h \ +context.lo context.o: $(srcdir)/context.c \ + config.h \ + $(srcdir)/anchor.h \ + getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/debug.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/context.h \ @@ -314,26 +317,28 @@ convert.lo convert.o: $(srcdir)/convert.c \ getdns/getdns_extra.h \ $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h \ $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/extension/default_eventloop.h \ - $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ + $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h \ $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/wire2str.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h $(srcdir)/const-info.h $(srcdir)/dict.h \ - $(srcdir)/list.h $(srcdir)/jsmn/jsmn.h $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h $(srcdir)/convert.h \ - $(srcdir)/debug.h -dict.lo dict.o: $(srcdir)/dict.c config.h \ + $(srcdir)/list.h $(srcdir)/jsmn/jsmn.h $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h $(srcdir)/convert.h +dict.lo dict.o: $(srcdir)/dict.c \ + config.h \ $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h $(srcdir)/context.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/const-info.h $(srcdir)/gldns/wire2str.h \ $(srcdir)/gldns/parseutil.h -dnssec.lo dnssec.o: $(srcdir)/dnssec.c config.h \ - $(srcdir)/debug.h getdns/getdns.h \ +dnssec.lo dnssec.o: $(srcdir)/dnssec.c \ + config.h \ + $(srcdir)/debug.h \ + getdns/getdns.h \ $(srcdir)/context.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ @@ -345,13 +350,15 @@ dnssec.lo dnssec.o: $(srcdir)/dnssec.c config.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/keyraw.h \ $(srcdir)/gldns/parseutil.h $(srcdir)/general.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/util/val_secalgo.h \ $(srcdir)/util/orig-headers/val_secalgo.h -general.lo general.o: $(srcdir)/general.c config.h \ - $(srcdir)/general.h getdns/getdns.h \ +general.lo general.o: $(srcdir)/general.c \ + config.h \ + $(srcdir)/general.h \ + getdns/getdns.h \ $(srcdir)/types-internal.h \ getdns/getdns_extra.h \ - $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/gldns/wire2str.h $(srcdir)/context.h \ - $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/ub_loop.h $(srcdir)/debug.h \ + $(srcdir)/gldns/wire2str.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ + $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h $(srcdir)/stub.h \ @@ -360,13 +367,14 @@ list.lo list.o: $(srcdir)/list.c $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h \ - config.h $(srcdir)/context.h \ - $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + config.h \ + $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/list.h $(srcdir)/dict.h -mdns.lo mdns.o: $(srcdir)/mdns.c config.h \ +mdns.lo mdns.o: $(srcdir)/mdns.c \ + config.h \ $(srcdir)/debug.h $(srcdir)/context.h \ getdns/getdns.h \ getdns/getdns_extra.h \ @@ -378,10 +386,13 @@ mdns.lo mdns.o: $(srcdir)/mdns.c config.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/gldns/rrdef.h $(srcdir)/util-internal.h \ $(srcdir)/platform.h $(srcdir)/mdns.h $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/lookup3.h \ $(srcdir)/util/orig-headers/lookup3.h -platform.lo platform.o: $(srcdir)/platform.c +platform.lo platform.o: $(srcdir)/platform.c $(srcdir)/platform.h \ + config.h pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c \ - config.h $(srcdir)/debug.h \ - getdns/getdns.h $(srcdir)/context.h \ + config.h \ + $(srcdir)/debug.h \ + getdns/getdns.h \ + $(srcdir)/context.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ @@ -390,16 +401,17 @@ pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h request-internal.lo request-internal.o: $(srcdir)/request-internal.c \ - config.h $(srcdir)/types-internal.h \ + config.h \ + $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/util-internal.h $(srcdir)/context.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h \ - $(srcdir)/dict.h $(srcdir)/debug.h $(srcdir)/convert.h $(srcdir)/general.h + $(srcdir)/dict.h $(srcdir)/convert.h $(srcdir)/general.h rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h \ config.h \ getdns/getdns.h \ @@ -407,7 +419,7 @@ rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h \ $(srcdir)/dict.h @@ -415,12 +427,13 @@ rr-iter.lo rr-iter.o: $(srcdir)/rr-iter.c $(srcdir)/rr-iter.h $(srcdir)/rr-dict. config.h \ getdns/getdns.h \ $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h -server.lo server.o: $(srcdir)/server.c config.h \ +server.lo server.o: $(srcdir)/server.c \ + config.h \ getdns/getdns_extra.h \ - getdns/getdns.h $(srcdir)/context.h \ - $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ + getdns/getdns.h \ + $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/util-internal.h $(srcdir)/platform.h @@ -444,45 +457,50 @@ sync.lo sync.o: $(srcdir)/sync.c \ getdns/getdns_extra.h \ $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h \ $(srcdir)/extension/default_eventloop.h $(srcdir)/extension/poll_eventloop.h \ - $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ + $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h $(srcdir)/util/lruhash.h \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/general.h $(srcdir)/util-internal.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h \ $(srcdir)/stub.h $(srcdir)/gldns/wire2str.h ub_loop.lo ub_loop.o: $(srcdir)/ub_loop.c $(srcdir)/ub_loop.h \ - config.h + config.h \ + getdns/getdns.h \ + getdns/getdns_extra.h \ + $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/debug.h util-internal.lo util-internal.o: $(srcdir)/util-internal.c \ config.h \ - getdns/getdns.h $(srcdir)/dict.h \ - $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/types-internal.h \ - getdns/getdns_extra.h $(srcdir)/list.h \ - $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ - $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/server.h \ + getdns/getdns.h \ + $(srcdir)/dict.h $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/types-internal.h \ + getdns/getdns_extra.h \ + $(srcdir)/list.h $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h \ + $(srcdir)/extension/poll_eventloop.h $(srcdir)/types-internal.h $(srcdir)/ub_loop.h $(srcdir)/debug.h $(srcdir)/server.h \ $(srcdir)/util/lruhash.h $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h \ $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h \ $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/gldns/str2wire.h \ $(srcdir)/gldns/rrdef.h $(srcdir)/dnssec.h $(srcdir)/gldns/rrdef.h gbuffer.lo gbuffer.o: $(srcdir)/gldns/gbuffer.c \ - config.h $(srcdir)/gldns/gbuffer.h + config.h \ + $(srcdir)/gldns/gbuffer.h keyraw.lo keyraw.o: $(srcdir)/gldns/keyraw.c \ - config.h $(srcdir)/gldns/keyraw.h \ - $(srcdir)/gldns/rrdef.h + config.h \ + $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/rrdef.h parse.lo parse.o: $(srcdir)/gldns/parse.c \ - config.h $(srcdir)/gldns/parse.h \ - $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h + config.h \ + $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h parseutil.lo parseutil.o: $(srcdir)/gldns/parseutil.c \ - config.h $(srcdir)/gldns/parseutil.h + config.h \ + $(srcdir)/gldns/parseutil.h rrdef.lo rrdef.o: $(srcdir)/gldns/rrdef.c \ - config.h $(srcdir)/gldns/rrdef.h \ - $(srcdir)/gldns/parseutil.h + config.h \ + $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h str2wire.lo str2wire.o: $(srcdir)/gldns/str2wire.c \ - config.h $(srcdir)/gldns/str2wire.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/parse.h \ - $(srcdir)/gldns/parseutil.h + config.h \ + $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h wire2str.lo wire2str.o: $(srcdir)/gldns/wire2str.c \ - config.h $(srcdir)/gldns/wire2str.h \ - $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/parseutil.h \ - $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/keyraw.h + config.h \ + $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h \ + $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/keyraw.h arc4_lock.lo arc4_lock.o: $(srcdir)/compat/arc4_lock.c \ config.h arc4random.lo arc4random.o: $(srcdir)/compat/arc4random.c \ @@ -511,7 +529,8 @@ strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c \ config.h strptime.lo strptime.o: $(srcdir)/compat/strptime.c \ config.h -locks.lo locks.o: $(srcdir)/util/locks.c config.h \ +locks.lo locks.o: $(srcdir)/util/locks.c \ + config.h \ $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h lookup3.lo lookup3.o: $(srcdir)/util/lookup3.c \ config.h \ @@ -523,10 +542,10 @@ lruhash.lo lruhash.o: $(srcdir)/util/lruhash.c \ $(srcdir)/util/orig-headers/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/orig-headers/locks.h \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util/auxiliary/util/fptr_wlist.h rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c \ - config.h $(srcdir)/util/auxiliary/log.h \ - $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/util/auxiliary/fptr_wlist.h \ - $(srcdir)/util/auxiliary/util/fptr_wlist.h $(srcdir)/util/rbtree.h \ - $(srcdir)/util/orig-headers/rbtree.h + config.h \ + $(srcdir)/util/auxiliary/log.h $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h \ + $(srcdir)/util/auxiliary/fptr_wlist.h $(srcdir)/util/auxiliary/util/fptr_wlist.h \ + $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c \ config.h \ $(srcdir)/util/auxiliary/util/data/packed_rrset.h \ @@ -538,18 +557,20 @@ val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c \ jsmn.lo jsmn.o: $(srcdir)/jsmn/jsmn.c $(srcdir)/jsmn/jsmn.h yxml.lo yxml.o: $(srcdir)/yxml/yxml.c $(srcdir)/yxml/yxml.h libev.lo libev.o: $(srcdir)/extension/libev.c \ - config.h $(srcdir)/types-internal.h \ + config.h \ + $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libev.h libevent.lo libevent.o: $(srcdir)/extension/libevent.c \ - config.h $(srcdir)/types-internal.h \ + config.h \ + $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libevent.h libuv.lo libuv.o: $(srcdir)/extension/libuv.c \ - config.h $(srcdir)/debug.h \ - $(srcdir)/types-internal.h \ + config.h \ + $(srcdir)/debug.h $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/getdns/getdns_ext_libuv.h @@ -565,8 +586,8 @@ poll_eventloop.lo poll_eventloop.o: $(srcdir)/extension/poll_eventloop.c \ $(srcdir)/util/auxiliary/util/log.h $(srcdir)/debug.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ $(srcdir)/gldns/pkthdr.h $(srcdir)/anchor.h $(srcdir)/platform.h select_eventloop.lo select_eventloop.o: $(srcdir)/extension/select_eventloop.c \ - config.h $(srcdir)/debug.h \ - $(srcdir)/types-internal.h \ + config.h \ + $(srcdir)/debug.h $(srcdir)/types-internal.h \ getdns/getdns.h \ getdns/getdns_extra.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/orig-headers/rbtree.h $(srcdir)/platform.h \ @@ -576,4 +597,3 @@ stubby.lo stubby.o: $(stubbysrcdir)/src/stubby.c \ getdns/getdns.h \ getdns/getdns_extra.h \ $(stubbysrcdir)/src/yaml/convert_yaml_to_json.h -version.lo version.o: $(stubbysrcdir)/src/version.c From d3b13c2bc93afa7e184d432f68d7da9102cebcb1 Mon Sep 17 00:00:00 2001 From: Sara Dickinson Date: Fri, 20 Oct 2017 16:22:03 +0100 Subject: [PATCH 33/59] Update stubby to use the 0.1.4 release --- stubby | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubby b/stubby index c9e89293..0cbd46ea 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit c9e89293beac4fe599024bfb021cb2ae832cc93f +Subproject commit 0cbd46ea6d0da727c42b0890d498366cd2b1ec2c From 8e12d86fc307db6b50803d1a1ea78227824369c3 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Sun, 22 Oct 2017 17:36:45 +0200 Subject: [PATCH 34/59] Fix a linking issue in stubby when libbsd is present When libbsd is found on the system during the configure, the result of `pkg-config --cflags libbsd-overlay` is added to `CFLAGS`: `-DLIBBSD_OVERLAY -isystem /usr/include/bsd` The result of `pkg-config --libs libbsd-overlay` is added to `LIBS`, but not to `STUBBY_LIBS`, which is used when linking stubby. Because of the new `CFLAGS`, the preprocessor replaces the call to `getopt()` in stubby.c with a call to `bsd_getop()`: ``` #ifdef LIBBSD_OVERLAY #undef getopt #define getopt(argc, argv, optstr) bsd_getopt(argc, argv, optstr) #endif ``` But since `-lbsd` has not been added to `STUBBY_LIBS`, the linking of stubby fails with an unresolved symbol: ``` ../libtool --tag=CC --mode=link gcc -o stubby stubby.lo convert_yaml_to_json.lo gbuffer.lo -lyaml libgetdns.la libtool: link: gcc -o .libs/stubby .libs/stubby.o .libs/convert_yaml_to_json.o .libs/gbuffer.o -lyaml ./.libs/libgetdns.so /usr/bin/ld: .libs/stubby.o: undefined reference to symbol 'bsd_getopt@@LIBBSD_0.0' /usr/lib/libbsd.so.0: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status ``` Simply adding the result of `pkg-config --libs libbsd-overlay` to `STUBBY_LIBS` in addition to `LIBS` fixes the issue. --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 1c7dc8e1..20756f56 100644 --- a/configure.ac +++ b/configure.ac @@ -1270,6 +1270,7 @@ fi # system implementation. PKG_CHECK_MODULES([LIBBSD],[libbsd-overlay],[ LIBS="$LIBS $LIBBSD_LIBS" +STUBBY_LIBS="$STUBBY_LIBS $LIBBSD_LIBS" CFLAGS="$CFLAGS $LIBBSD_CFLAGS" ],[ AC_MSG_WARN([libbsd not found or usable; using embedded code instead]) From 725f5d486a67fe859e8b38282ec2850ee02ad42c Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 27 Oct 2017 09:58:25 +0200 Subject: [PATCH 35/59] Credit Remi Gacogne --- ChangeLog | 2 ++ stubby | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 189c3da3..eb4cc8cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ * 2017-1?-??: Version 1.2.1 + * Bugfix #348: Fix a linking issue in stubby when libbsd is present + Thanks Remi Gacogne * Fix Makefile dependencies for parallel install. Thanks ilovezfs diff --git a/stubby b/stubby index 0cbd46ea..c9e89293 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit 0cbd46ea6d0da727c42b0890d498366cd2b1ec2c +Subproject commit c9e89293beac4fe599024bfb021cb2ae832cc93f From e2b26609d4f0970861e0b67bdda7f42066f6dcf2 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 27 Oct 2017 13:03:49 +0200 Subject: [PATCH 36/59] Stubby back to develop branch --- stubby | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubby b/stubby index c9e89293..0cbd46ea 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit c9e89293beac4fe599024bfb021cb2ae832cc93f +Subproject commit 0cbd46ea6d0da727c42b0890d498366cd2b1ec2c From 09b4f6d57d65d49296c5f571039baaea74978f3d Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 31 Oct 2017 16:22:09 +0100 Subject: [PATCH 37/59] One more _getdns_perror --- src/extension/poll_eventloop.c | 2 +- src/extension/select_eventloop.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index 7cd80cd9..6924ebe1 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -143,7 +143,7 @@ static uint64_t get_now_plus(uint64_t amount) uint64_t now; if (gettimeofday(&tv, NULL)) { - perror("gettimeofday() failed"); + _getdns_perror("gettimeofday() failed"); exit(EXIT_FAILURE); } now = tv.tv_sec * 1000000 + tv.tv_usec; diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 0350f1d5..7980d0da 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -38,7 +38,7 @@ static uint64_t get_now_plus(uint64_t amount) uint64_t now; if (gettimeofday(&tv, NULL)) { - perror("gettimeofday() failed"); + _getdns_perror("gettimeofday() failed"); exit(EXIT_FAILURE); } now = tv.tv_sec * 1000000 + tv.tv_usec; From 4669956391d682c07db27a2f4f2e551f0e65c374 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Wed, 1 Nov 2017 10:59:55 +0100 Subject: [PATCH 38/59] retry full recursion bogus answers only when... dnssec validation was requested in the first place --- src/general.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/general.c b/src/general.c index 23d9b735..6df8d383 100644 --- a/src/general.c +++ b/src/general.c @@ -221,7 +221,10 @@ _getdns_check_dns_req_complete(getdns_dns_req *dns_req) dns_req->dnssec_return_all_statuses )) #endif - || ( dns_req->context->resolution_type == GETDNS_RESOLUTION_RECURSING + || ( dns_req->context->resolution_type == GETDNS_RESOLUTION_RECURSING + && (dns_req->dnssec_return_status || + dns_req->dnssec_return_only_secure || + dns_req->dnssec_return_all_statuses) && _getdns_bogus(dns_req)) )) { /* Reschedule timeout for this DNS request From b4ae4b71216f5318cddd5413f07d29d606cc69f9 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Wed, 1 Nov 2017 15:01:58 +0100 Subject: [PATCH 39/59] Cannot fetch DNSKEY when in DNSKEY callback ... for the same name in full recursion --- src/dnssec.c | 42 +++++++++++++++++++++++++++++++++++------- src/general.c | 6 ++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/dnssec.c b/src/dnssec.c index 92282ddb..72de9017 100644 --- a/src/dnssec.c +++ b/src/dnssec.c @@ -934,6 +934,17 @@ static void val_chain_sched_soa(chain_head *head, const uint8_t *dname) val_chain_sched_soa_node(node); } +static chain_head *_dnskey_query(const chain_node *node) +{ + chain_head *head; + + for (head = node->chains; head; head = head->next) + if (head->rrset.rr_type == GETDNS_RRTYPE_DNSKEY && + head->parent == node) + return head; + return NULL; +} + static void val_chain_node_cb(getdns_dns_req *dnsreq); static void val_chain_sched_node(chain_node *node) { @@ -951,13 +962,27 @@ static void val_chain_sched_node(chain_node *node) DEBUG_SEC("schedule DS & DNSKEY lookup for %s\n", name); node->lock++; - if (! node->dnskey_req /* not scheduled */ && - _getdns_general_loop(context, loop, name, GETDNS_RRTYPE_DNSKEY, - CD_extension(node->chains->netreq->owner), - node, &node->dnskey_req, NULL, val_chain_node_cb)) + if (! node->dnskey_req) { + chain_head *head; - node->dnskey_req = NULL; + /* Reuse the DNSKEY query if this node is scheduled in the + * context of validating a DNSKEY query, because libunbound + * does not callback from a callback for the same query. + */ + if ((head = _dnskey_query(node))) { + DEBUG_SEC("Found DNSKEY head: %p\n", (void *)head); + node->dnskey_req = head->netreq; + node->dnskey.pkt = head->netreq->response; + node->dnskey.pkt_len = head->netreq->response_len; + + } else if (_getdns_general_loop( + context, loop, name, GETDNS_RRTYPE_DNSKEY, + CD_extension(node->chains->netreq->owner), + node, &node->dnskey_req, NULL, val_chain_node_cb)) + + node->dnskey_req = NULL; + } if (! node->ds_req && node->parent /* not root */ && _getdns_general_loop(context, loop, name, GETDNS_RRTYPE_DS, CD_extension(node->chains->netreq->owner), @@ -3341,7 +3366,7 @@ void _getdns_validation_chain_timeout(getdns_dns_req *dnsreq) void _getdns_cancel_validation_chain(getdns_dns_req *dnsreq) { - chain_head *head = dnsreq->chain, *next; + chain_head *head = dnsreq->chain, *next, *dnskey_head; chain_node *node; size_t node_count; @@ -3353,7 +3378,10 @@ void _getdns_cancel_validation_chain(getdns_dns_req *dnsreq) ; node_count ; node_count--, node = node->parent ) { - if (node->dnskey_req) + if (node->dnskey_req && + !( (dnskey_head = _dnskey_query(node)) + && dnskey_head->netreq == node->dnskey_req)) + _getdns_context_cancel_request( node->dnskey_req->owner); diff --git a/src/general.c b/src/general.c index 6df8d383..b263c0a9 100644 --- a/src/general.c +++ b/src/general.c @@ -449,14 +449,12 @@ _getdns_submit_netreq(getdns_network_req *netreq, uint64_t *now_ms) if (_getdns_ub_loop_enabled(&context->ub_loop)) ub_resolve_r = ub_resolve_event(context->unbound_ctx, name, netreq->request_type, dns_req->request_class, - netreq, ub_resolve_event_callback, &(netreq->unbound_id)) ? - GETDNS_RETURN_GENERIC_ERROR : GETDNS_RETURN_GOOD; + netreq, ub_resolve_event_callback, &(netreq->unbound_id)); else #endif ub_resolve_r = ub_resolve_async(context->unbound_ctx, name, netreq->request_type, dns_req->request_class, - netreq, ub_resolve_callback, &(netreq->unbound_id)) ? - GETDNS_RETURN_GENERIC_ERROR : GETDNS_RETURN_GOOD; + netreq, ub_resolve_callback, &(netreq->unbound_id)); if (dnsreq_freed) return DNS_REQ_FINISHED; dns_req->freed = NULL; From 270c3d654fce9011b637b2d7acd13c945398e693 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Wed, 1 Nov 2017 15:28:46 +0100 Subject: [PATCH 40/59] Support DNSSEC validation without support records --- src/dnssec.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dnssec.c b/src/dnssec.c index 72de9017..57664c39 100644 --- a/src/dnssec.c +++ b/src/dnssec.c @@ -2548,6 +2548,11 @@ static int chain_node_get_trusted_keys( node->dnskey_signer = keytag; return GETDNS_DNSSEC_SECURE; } + /* ta is the DNSKEY for this name? */ + if (_dname_equal(ta->name, node->dnskey.name)) { + *keys = ta; + return GETDNS_DNSSEC_SECURE; + } /* ta is parent's ZSK */ if ((keytag = key_proves_nonexistance( mf, now, skew, ta, &node->ds, NULL))) { @@ -3565,13 +3570,17 @@ getdns_validate_dnssec2(getdns_list *records_to_validate, fflush(stdout); #endif - if (!records_to_validate || !support_records || !trust_anchors) + if (!records_to_validate || !trust_anchors) return GETDNS_RETURN_INVALID_PARAMETER; mf = &records_to_validate->mf; /* First convert everything to wire format */ - if (!(support = _getdns_list2wire(support_records, + + if (!support_records) + (void) memset((support = support_buf), 0, GLDNS_HEADER_SIZE); + + else if (!(support = _getdns_list2wire(support_records, support_buf, &support_len, mf))) return GETDNS_RETURN_MEMORY_ERROR; From 7e103217c684b7e0012f3ffb44fb9cc5518a25b7 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Wed, 1 Nov 2017 16:47:28 +0100 Subject: [PATCH 41/59] unsigned RRs in authority section with BIND when +CD flag is used --- src/dnssec.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/dnssec.c b/src/dnssec.c index 57664c39..a4de8b1c 100644 --- a/src/dnssec.c +++ b/src/dnssec.c @@ -802,11 +802,14 @@ static void add_pkt2val_chain(struct mem_funcs *mf, if (is_synthesized_cname(rrset)) continue; + if (!(rrsig = _getdns_rrsig_iter_init(&rrsig_spc, rrset)) + && _getdns_rr_iter_section(&i->rr_i) != SECTION_ANSWER) + continue; /* No sigs in authority section is okayish */ + if (!(head = add_rrset2val_chain(mf, chain_p, rrset, netreq))) continue; - for ( rrsig = _getdns_rrsig_iter_init(&rrsig_spc, rrset), n_rrsigs = 0 - ; rrsig + for ( n_rrsigs = 0; rrsig ; rrsig = _getdns_rrsig_iter_next(rrsig), n_rrsigs++) { /* Signature, so lookup DS/DNSKEY at signer's name */ From 2434336ead40f2b09b9c9a9e36c64895a78516d1 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 2 Nov 2017 12:42:26 +0100 Subject: [PATCH 42/59] Include all RRSIGs in validation chain Because we don't know algorithm support of other validators. But still canonicalize the RRset with the one used to validate just because we can. --- src/dnssec.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/dnssec.c b/src/dnssec.c index a4de8b1c..03e8c326 100644 --- a/src/dnssec.c +++ b/src/dnssec.c @@ -2971,6 +2971,26 @@ static void append_rrset2val_chain_list( _getdns_list_append_this_dict(val_chain_list, rr_dict)) getdns_dict_destroy(rr_dict); + /* Append the other RRSIGs, which were not used for validation too, + * because other validators might not have the same algorithm support. + */ + for ( rrsig = _getdns_rrsig_iter_init(&rrsig_spc, rrset) + ; rrsig + ; rrsig = _getdns_rrsig_iter_next(rrsig)) { + + if (rrsig->rr_i.nxt < rrsig->rr_i.rr_type + 28) + continue; + + if (gldns_read_uint16(rrsig->rr_i.rr_type + 26) + == (signer & 0xFFFF)) + continue; + + orig_ttl = gldns_read_uint32(rrsig->rr_i.rr_type + 14); + if ((rr_dict = _getdns_rr_iter2rr_dict_canonical( + &val_chain_list->mf, &rrsig->rr_i, &orig_ttl)) && + _getdns_list_append_this_dict(val_chain_list, rr_dict)) + getdns_dict_destroy(rr_dict); + } if (val_rrset != val_rrset_spc) GETDNS_FREE(val_chain_list->mf, val_rrset); } From 2d0d1c9e6fa5fba583194bd1020d69fe2afc7fb4 Mon Sep 17 00:00:00 2001 From: Jim Hague Date: Thu, 2 Nov 2017 13:21:50 +0000 Subject: [PATCH 43/59] Add configure --with-piddir. Use this for runstatedir. You need autoconf 2.70 (or 2.69 plus patch as in Debian) for runstatedir to be automatically in the configure script. This adds a always-present config option. --- configure.ac | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configure.ac b/configure.ac index 1c7dc8e1..b07ca624 100644 --- a/configure.ac +++ b/configure.ac @@ -38,6 +38,17 @@ sinclude(./m4/pkg.m4) AC_INIT([getdns], [1.2.1], [users@getdnsapi.net], [], [https://getdnsapi.net]) +# Autoconf 2.70 will have set up runstatedir. 2.69 is frequently (Debian) +# patched to do the same, but frequently (MacOS) not. So add a with option +# for pid file location, and default it to runstatedir if present. +default_piddir=${runstatedir:-"${localstatedir}/run"} +AC_ARG_WITH([piddir], + [AS_HELP_STRING([--with-piddir=DIR], + [directory for pid files @<:@default=RUNSTATEDIR or LOCALSTATEDIR/run@:>@])], + [], + [with_piddir=${default_piddir}]) +AC_SUBST([runstatedir], [$with_piddir]) + # Dont forget to put a dash in front of the release candidate!!! # That is how it is done with semantic versioning! # From 5dbfdd4ddb345fe77b45e5fdd6b9d0500d143ab2 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 2 Nov 2017 15:06:56 +0100 Subject: [PATCH 44/59] Update ChangeLog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index eb4cc8cf..dcc11aaf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ * 2017-1?-??: Version 1.2.1 * Bugfix #348: Fix a linking issue in stubby when libbsd is present Thanks Remi Gacogne + * More robust scheduling; Eliminating a segfault with long running + applications. + * Miscellaneous Windows portability fixes from Jim Hague. * Fix Makefile dependencies for parallel install. Thanks ilovezfs From 546fc1d4041a495bed936e18bcbce9c542f3dfa8 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Thu, 2 Nov 2017 15:14:07 +0100 Subject: [PATCH 45/59] Update ChangeLog --- ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ChangeLog b/ChangeLog index dcc11aaf..6a8cd440 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ * 2017-1?-??: Version 1.2.1 + * Bugfix: Tolerate unsigned and unused RRsets in the authority section. + Fixes DNSSEC with BIND upstream. + * Bugfix: DNSSEC validation without support records + * Bugfix: Validation of full recursive DNSKEY lookups + * Bugfix: Retry to validate full recursion BOGUS replies with zero + configuration DNSSEC only when DNSSEC was actually requested * Bugfix #348: Fix a linking issue in stubby when libbsd is present Thanks Remi Gacogne * More robust scheduling; Eliminating a segfault with long running From 4b8ea64140a14155ae2355cad6d39d7fed6d8b25 Mon Sep 17 00:00:00 2001 From: Sara Dickinson Date: Thu, 2 Nov 2017 16:55:25 +0000 Subject: [PATCH 46/59] Make sure the runstatedir exists --- src/Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.in b/src/Makefile.in index 594f714b..7ea9bcf1 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -223,6 +223,7 @@ install-stubby-files-windows: stubby.yml.windows install-stubby: stubby install-stubby-files-@HOSTOS@ $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) $(LIBTOOL) --mode=install cp stubby $(DESTDIR)$(bindir) + $(INSTALL) -m 755 -d $(runstatedir) uninstall-stubby: $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(bindir)/stubby From a8fac29a66a3871f1e9dbb1802b629228385395d Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 13:50:13 +0100 Subject: [PATCH 47/59] Handle more harmless I/O error cases + - never exit on I/O errors - never stop listening on I/O errors - extended platfrom.[ch] with _getdns_strerror() --- src/anchor.c | 13 +-- src/extension/poll_eventloop.c | 8 +- src/extension/select_eventloop.c | 7 +- src/platform.c | 137 +++++++++++++++++++++++++++++++ src/platform.h | 67 ++++++++++++++- src/server.c | 52 ++++++++---- src/stub.c | 82 +++++++++--------- src/test/check_getdns_common.c | 1 + 8 files changed, 294 insertions(+), 73 deletions(-) diff --git a/src/anchor.c b/src/anchor.c index a5a31b2e..6d3877e0 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -1199,10 +1199,10 @@ static void tas_read_cb(void *userarg) return; } } - } else if (_getdns_socketerror() == _getdns_EWOULDBLOCK) + } else if (_getdns_socket_retry()) return; - DEBUG_ANCHOR("Read error: %d %s\n", (int)n, strerror(errno)); + DEBUG_ANCHOR("Read error: %d %s\n", (int)n, _getdns_errnostr()); GETDNS_CLEAR_EVENT(a->loop, &a->event); tas_next(context, a); } @@ -1249,10 +1249,10 @@ static void tas_write_cb(void *userarg) tas_read_cb, NULL, tas_timeout_cb)); return; - } else if (_getdns_socketerror() == _getdns_EWOULDBLOCK || _getdns_socketerror() == _getdns_EINPROGRESS) + } else if (_getdns_socket_retry()) return; - DEBUG_ANCHOR("Write error: %s\n", strerror(errno)); + DEBUG_ANCHOR("Write error: %s\n", _getdns_errnostr()); GETDNS_CLEAR_EVENT(a->loop, &a->event); tas_next(context, a); } @@ -1316,7 +1316,8 @@ static void tas_connect(getdns_context *context, tas_connection *a) if ((a->fd = socket(( a->req->request_type == GETDNS_RRTYPE_A ? AF_INET : AF_INET6), SOCK_STREAM, IPPROTO_TCP)) == -1) { - DEBUG_ANCHOR("Error creating socket: %s\n", strerror(errno)); + DEBUG_ANCHOR("Error creating socket: %s\n", + _getdns_errnostr()); tas_next(context, a); return; } @@ -1426,7 +1427,7 @@ static void tas_connect(getdns_context *context, tas_connection *a) DEBUG_ANCHOR("Scheduled write with event\n"); return; } else - DEBUG_ANCHOR("Connect error: %s\n", strerror(errno)); + DEBUG_ANCHOR("Connect error: %s\n", _getdns_errnostr()); error: tas_next(context, a); diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index 6924ebe1..743c6a81 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -408,8 +408,12 @@ poll_eventloop_run_once(getdns_eventloop *loop, int blocking) } else #endif if (_getdns_poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { - _getdns_perror("poll() failed"); - exit(EXIT_FAILURE); + if (_getdns_socketerror() == _getdns_EAGAIN || + _getdns_socketerror() == _getdns_EINTR ) + return; + + DEBUG_SCHED("I/O error with poll(): %s\n", _getdns_errnostr()); + return; } now = get_now_plus(0); diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 7980d0da..0b7b3592 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -245,8 +245,11 @@ select_eventloop_run_once(getdns_eventloop *loop, int blocking) #endif if (select(max_fd + 1, &readfds, &writefds, NULL, (timeout == TIMEOUT_FOREVER ? NULL : &tv)) < 0) { - _getdns_perror("select() failed"); - exit(EXIT_FAILURE); + if (_getdns_socket_retr()) + return; + + DEBUG_SCHED("I/O error with select(): %s\n", _getdns_errnostr()); + return; } #ifdef USE_WINSOCK } diff --git a/src/platform.c b/src/platform.c index 61f2bdb6..aad62d63 100644 --- a/src/platform.c +++ b/src/platform.c @@ -59,6 +59,139 @@ void _getdns_perror(const char *str) fputs(msg, stderr); } +const char *_getdns_strerror(DWORD errnum) +{ + static char unknown[32]; + + switch(errnum) { + case WSA_INVALID_HANDLE: return "Specified event object handle is invalid."; + case WSA_NOT_ENOUGH_MEMORY: return "Insufficient memory available."; + case WSA_INVALID_PARAMETER: return "One or more parameters are invalid."; + case WSA_OPERATION_ABORTED: return "Overlapped operation aborted."; + case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state."; + case WSA_IO_PENDING: return "Overlapped operations will complete later."; + case WSAEINTR: return "Interrupted function call."; + case WSAEBADF: return "File handle is not valid."; + case WSAEACCES: return "Permission denied."; + case WSAEFAULT: return "Bad address."; + case WSAEINVAL: return "Invalid argument."; + case WSAEMFILE: return "Too many open files."; + case WSAEWOULDBLOCK: return "Resource temporarily unavailable."; + case WSAEINPROGRESS: return "Operation now in progress."; + case WSAEALREADY: return "Operation already in progress."; + case WSAENOTSOCK: return "Socket operation on nonsocket."; + case WSAEDESTADDRREQ: return "Destination address required."; + case WSAEMSGSIZE: return "Message too long."; + case WSAEPROTOTYPE: return "Protocol wrong type for socket."; + case WSAENOPROTOOPT: return "Bad protocol option."; + case WSAEPROTONOSUPPORT: return "Protocol not supported."; + case WSAESOCKTNOSUPPORT: return "Socket type not supported."; + case WSAEOPNOTSUPP: return "Operation not supported."; + case WSAEPFNOSUPPORT: return "Protocol family not supported."; + case WSAEAFNOSUPPORT: return "Address family not supported by protocol family."; + case WSAEADDRINUSE: return "Address already in use."; + case WSAEADDRNOTAVAIL: return "Cannot assign requested address."; + case WSAENETDOWN: return "Network is down."; + case WSAENETUNREACH: return "Network is unreachable."; + case WSAENETRESET: return "Network dropped connection on reset."; + case WSAECONNABORTED: return "Software caused connection abort."; + case WSAECONNRESET: return "Connection reset by peer."; + case WSAENOBUFS: return "No buffer space available."; + case WSAEISCONN: return "Socket is already connected."; + case WSAENOTCONN: return "Socket is not connected."; + case WSAESHUTDOWN: return "Cannot send after socket shutdown."; + case WSAETOOMANYREFS: return "Too many references."; + case WSAETIMEDOUT: return "Connection timed out."; + case WSAECONNREFUSED: return "Connection refused."; + case WSAELOOP: return "Cannot translate name."; + case WSAENAMETOOLONG: return "Name too long."; + case WSAEHOSTDOWN: return "Host is down."; + case WSAEHOSTUNREACH: return "No route to host."; + case WSAENOTEMPTY: return "Directory not empty."; + case WSAEPROCLIM: return "Too many processes."; + case WSAEUSERS: return "User quota exceeded."; + case WSAEDQUOT: return "Disk quota exceeded."; + case WSAESTALE: return "Stale file handle reference."; + case WSAEREMOTE: return "Item is remote."; + case WSASYSNOTREADY: return "Network subsystem is unavailable."; + case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range."; + case WSANOTINITIALISED: return "Successful WSAStartup not yet performed."; + case WSAEDISCON: return "Graceful shutdown in progress."; + case WSAENOMORE: return "No more results."; + case WSAECANCELLED: return "Call has been canceled."; + case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid."; + case WSAEINVALIDPROVIDER: return "Service provider is invalid."; + case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize."; + case WSASYSCALLFAILURE: return "System call failure."; + case WSASERVICE_NOT_FOUND: return "Service not found."; + case WSATYPE_NOT_FOUND: return "Class type not found."; + case WSA_E_NO_MORE: return "No more results."; + case WSA_E_CANCELLED: return "Call was canceled."; + case WSAEREFUSED: return "Database query was refused."; + case WSAHOST_NOT_FOUND: return "Host not found."; + case WSATRY_AGAIN: return "Nonauthoritative host not found."; + case WSANO_RECOVERY: return "This is a nonrecoverable error."; + case WSANO_DATA: return "Valid name, no data record of requested type."; + case WSA_QOS_RECEIVERS: return "QOS receivers."; + case WSA_QOS_SENDERS: return "QOS senders."; + case WSA_QOS_NO_SENDERS: return "No QOS senders."; + case WSA_QOS_NO_RECEIVERS: return "QOS no receivers."; + case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed."; + case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error."; + case WSA_QOS_POLICY_FAILURE: return "QOS policy failure."; + case WSA_QOS_BAD_STYLE: return "QOS bad style."; + case WSA_QOS_BAD_OBJECT: return "QOS bad object."; + case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error."; + case WSA_QOS_GENERIC_ERROR: return "QOS generic error."; + case WSA_QOS_ESERVICETYPE: return "QOS service type error."; + case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; + case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; + case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; + case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize."; + case WSASYSCALLFAILURE: return "System call failure."; + case WSASERVICE_NOT_FOUND: return "Service not found."; + case WSATYPE_NOT_FOUND: return "Class type not found."; + case WSA_E_NO_MORE: return "No more results."; + case WSA_E_CANCELLED: return "Call was canceled."; + case WSAEREFUSED: return "Database query was refused."; + case WSAHOST_NOT_FOUND: return "Host not found."; + case WSATRY_AGAIN: return "Nonauthoritative host not found."; + case WSANO_RECOVERY: return "This is a nonrecoverable error."; + case WSANO_DATA: return "Valid name, no data record of requested type."; + case WSA_QOS_RECEIVERS: return "QOS receivers."; + case WSA_QOS_SENDERS: return "QOS senders."; + case WSA_QOS_NO_SENDERS: return "No QOS senders."; + case WSA_QOS_NO_RECEIVERS: return "QOS no receivers."; + case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed."; + case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error."; + case WSA_QOS_POLICY_FAILURE: return "QOS policy failure."; + case WSA_QOS_BAD_STYLE: return "QOS bad style."; + case WSA_QOS_BAD_OBJECT: return "QOS bad object."; + case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error."; + case WSA_QOS_GENERIC_ERROR: return "QOS generic error."; + case WSA_QOS_ESERVICETYPE: return "QOS service type error."; + case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; + case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; + case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; + case WSA_QOS_EFILTERTYPE: return "Invalid QOS filter type."; + case WSA_QOS_EFILTERCOUNT: return "Incorrect QOS filter count."; + case WSA_QOS_EOBJLENGTH: return "Invalid QOS object length."; + case WSA_QOS_EFLOWCOUNT: return "Incorrect QOS flow count."; + /*case WSA_QOS_EUNKOWNPSOBJ: return "Unrecognized QOS object.";*/ + case WSA_QOS_EPOLICYOBJ: return "Invalid QOS policy object."; + case WSA_QOS_EFLOWDESC: return "Invalid QOS flow descriptor."; + case WSA_QOS_EPSFLOWSPEC: return "Invalid QOS provider-specific flowspec."; + case WSA_QOS_EPSFILTERSPEC: return "Invalid QOS provider-specific filterspec."; + case WSA_QOS_ESDMODEOBJ: return "Invalid QOS shape discard mode object."; + case WSA_QOS_ESHAPERATEOBJ: return "Invalid QOS shaping rate object."; + case WSA_QOS_RESERVED_PETYPE: return "Reserved policy QOS element type."; + default: + snprintf(unknown, sizeof(unknown), + "unknown WSA error code %d", (int)err); + return unknown; + } +} + #else void _getdns_perror(const char *str) @@ -66,4 +199,8 @@ void _getdns_perror(const char *str) perror(str); } +const char *_getdns_strerror(int errnum) +{ + return strerror(errnum); +} #endif diff --git a/src/platform.h b/src/platform.h index e0ec5454..d2b69da5 100644 --- a/src/platform.h +++ b/src/platform.h @@ -39,16 +39,23 @@ #ifdef USE_WINSOCK typedef u_short sa_family_t; +#define _getdns_EINTR (WSAEINTR) #define _getdns_EAGAIN (WSATRY_AGAIN) #define _getdns_EWOULDBLOCK (WSAEWOULDBLOCK) #define _getdns_EINPROGRESS (WSAEINPROGRESS) +#define _getdns_ENOBUFS (WSAENOBUFS) +#define _getdns_EPROTO (0) #define _getdns_EMFILE (WSAEMFILE) +#define _getdns_ENFILE (WSAENFILE) #define _getdns_ECONNRESET (WSAECONNRESET) +#define _getdns_ECONNABORTED (0) +#define _getdns_EISCONN (WSAEISCONN) #define _getdns_closesocket(fd) closesocket(fd) #define _getdns_poll(fdarray, nsockets, timer) WSAPoll(fdarray, nsockets, timer) #define _getdns_socketerror() (WSAGetLastError()) +const char *_getdns_strerror(DWORD errnum); #else /* USE_WINSOCK */ #ifdef HAVE_SYS_POLL_H @@ -57,11 +64,53 @@ typedef u_short sa_family_t; # include #endif +#define _getdns_EINTR (EINTR) #define _getdns_EAGAIN (EAGAIN) +#ifdef EWOULDBLOCK #define _getdns_EWOULDBLOCK (EWOULDBLOCK) -#define _getdns_EINPROGRESS (EINPROGRESS) -#define _getdns_EMFILE (EMFILE) -#define _getdns_ECONNRESET (ECONNRESET) +#else +#define _getdns_EWOULDBLOCK (0) +#endif +#ifdef EINPROGRESS +# define _getdns_EINPROGRESS (EINPROGRESS) +#else +# define _getdns_EINPROGRESS (0) +#endif +#ifdef ENOBUFS +# define _getdns_ENOBUFS (ENOBUFS) +#else +# define _getdns_ENOBUFS (0) +#endif +#ifdef EPROTO +# define _getdns_EPROTO (EPROTO) +#else +# define _getdns_EPROTO (0) +#endif +#ifdef EMFILE +# define _getdns_EMFILE (EMFILE) +#else +# define _getdns_EMFILE (0) +#endif +#ifdef ENFILE +# define _getdns_ENFILE (ENFILE) +#else +# define _getdns_ENFILE (0) +#endif +#ifdef ECONNRESET +# define _getdns_ECONNRESET (ECONNRESET) +#else +# define _getdns_ECONNRESET (0) +#endif +#ifdef ECONNABORTED +# define _getdns_ECONNABORTED (ECONNABORTED) +#else +# define _getdns_ECONNABORTED (0) +#endif +#ifdef EISCONN +# define _getdns_EISCONN (EISCONN) +#else +# define _getdns_EISCONN (0) +#endif #define SOCKADDR struct sockaddr #define SOCKADDR_IN struct sockaddr_in @@ -77,8 +126,20 @@ typedef u_short sa_family_t; #define _getdns_closesocket(fd) close(fd) #define _getdns_poll(fdarray, nsockets, timer) poll(fdarray, nsockets, timer) #define _getdns_socketerror() (errno) + +const char *_getdns_strerror(int errnum); #endif void _getdns_perror(const char *str); +#define _getdns_errnostr() (_getdns_strerror(_getdns_socketerror())) +#define _getdns_errno_retry(X) ( (X) == _getdns_EINTR \ + || (X) == _getdns_EAGAIN \ + || (X) == _getdns_EWOULDBLOCK \ + || (X) == _getdns_EINPROGRESS \ + || (X) == _getdns_ENOBUFS ) +#define _getdns_socket_retry() (_getdns_errno_retry(_getdns_socketerror())) +#define _getdns_resource_depletion() ( _getdns_socketerror() == _getdns_ENFILE \ + || _getdns_socketerror() == _getdns_EMFILE ) + #endif diff --git a/src/server.c b/src/server.c index f29cb603..28aa9052 100644 --- a/src/server.c +++ b/src/server.c @@ -191,6 +191,12 @@ static void tcp_write_cb(void *userarg) (const void *)&to_write->write_buf[to_write->written], to_write->write_buf_len - to_write->written, 0)) == -1) { + if (_getdns_socket_retry()) + return; + + DEBUG_SERVER("I/O error from send(): %s\n", + _getdns_errnostr()); + /* IO error, close connection */ conn->event.read_cb = conn->event.write_cb = conn->event.timeout_cb = NULL; @@ -281,10 +287,11 @@ getdns_reply( if (conn->l->fd >= 0 && sendto(conn->l->fd, (void *)buf, len, 0, (struct sockaddr *)&conn->remote_in, conn->addrlen) == -1) { - /* IO error, cleanup this listener */ - loop->vmt->clear(loop, &conn->l->event); - _getdns_closesocket(conn->l->fd); - conn->l->fd = -1; + /* TODO: handle _getdns_socket_retry() */ + + /* IO error, never cleanup a listener because of I/O error */ + DEBUG_SERVER("I/O error from sendto(): %s\n", + _getdns_errnostr()); } /* Unlink this connection */ (void) _getdns_rbtree_delete( @@ -364,10 +371,13 @@ static void tcp_read_cb(void *userarg) if ((bytes_read = recv(conn->fd, (void *)conn->read_pos, conn->to_read, 0)) < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) + if (_getdns_socket_retry()) return; /* Come back to do the read later */ /* IO error, close connection */ + DEBUG_SERVER("I/O error from recv(): %s\n", + _getdns_errnostr()); + tcp_connection_destroy(conn); return; } @@ -475,10 +485,19 @@ static void tcp_accept_cb(void *userarg) conn->super.addrlen = sizeof(conn->super.remote_in); if ((conn->fd = accept(l->fd, (struct sockaddr *) &conn->super.remote_in, &conn->super.addrlen)) == -1) { - /* IO error, cleanup this listener */ - loop->vmt->clear(loop, &l->event); - _getdns_closesocket(l->fd); - l->fd = -1; + + if (_getdns_socket_retry() || + _getdns_socketerror() == _getdns_ECONNRESET) + ; /* pass */ + + else if (_getdns_resource_depletion()) + ; /* TODO: Stop listening for a little while? */ + + else + DEBUG_SERVER("I/O error during accept: %s\n", + _getdns_errnostr()); + + /* Never cleanup a listener because of I/O errors! */ GETDNS_FREE(*mf, conn); return; } @@ -545,18 +564,17 @@ static void udp_read_cb(void *userarg) conn->addrlen = sizeof(conn->remote_in); if ((len = recvfrom(l->fd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { - if (_getdns_socketerror() == _getdns_ECONNRESET) { + if ( _getdns_socket_retry() && + _getdns_socketerror() != _getdns_ECONNRESET) { /* * WINSOCK gives ECONNRESET on ICMP Port Unreachable * being received. Ignore it. - * */ - GETDNS_FREE(*mf, conn); - return; + */ + DEBUG_SERVER("I/O error from recvfrom: %s\n", + _getdns_errnostr()); + } - /* IO error, cleanup this listener. */ - loop->vmt->clear(loop, &l->event); - _getdns_closesocket(l->fd); - l->fd = -1; + /* Never cleanup a listener because of an I/O error! */ #if 0 && defined(SERVER_DEBUG) && SERVER_DEBUG } else { diff --git a/src/stub.c b/src/stub.c index 49af9d8c..e9089291 100644 --- a/src/stub.c +++ b/src/stub.c @@ -57,16 +57,17 @@ #include "pubkey-pinning.h" /* WSA TODO: - * STUB_TCP_WOULDBLOCK added to deal with edge triggered event loops (versus + * STUB_TCP_RETRY added to deal with edge triggered event loops (versus * level triggered). See also lines containing WSA TODO below... */ #define STUB_TRY_AGAIN_LATER -24 /* EMFILE, i.e. Out of OS resources */ #define STUB_NO_AUTH -8 /* Existing TLS connection is not authenticated */ #define STUB_CONN_GONE -7 /* Connection has failed, clear queue*/ -#define STUB_TCP_WOULDBLOCK -6 +#define STUB_TCP_RETRY -6 #define STUB_OUT_OF_OPTIONS -5 /* upstream options exceeded MAXIMUM_UPSTREAM_OPTION_SPACE */ #define STUB_SETUP_ERROR -4 -#define STUB_TCP_AGAIN -3 +#define STUB_TCP_MORE_TO_READ -3 +#define STUB_TCP_MORE_TO_WRITE -3 #define STUB_TCP_ERROR -2 /* Don't currently have access to the context whilst doing handshake */ @@ -407,9 +408,9 @@ tcp_connect(getdns_upstream *upstream, getdns_transport_list_t transport) NULL, 0, NULL, NULL) == 0) { return fd; } - if (errno == EINPROGRESS) { + if (_getdns_socketerror() == _getdns_EINPROGRESS || + _getdns_socketerror() == _getdns_EWOULDBLOCK) return fd; - } #else (void)transport; #endif @@ -429,10 +430,8 @@ tcp_connected(getdns_upstream *upstream) { int error = 0; socklen_t len = (socklen_t)sizeof(error); getsockopt(upstream->fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len); - if (error == _getdns_EINPROGRESS) - return STUB_TCP_AGAIN; - else if (error == _getdns_EWOULDBLOCK || error == _getdns_EAGAIN) - return STUB_TCP_WOULDBLOCK; + if (_getdns_errno_retry(error)) + return STUB_TCP_RETRY; else if (error != 0) { return STUB_SETUP_ERROR; } @@ -639,8 +638,8 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } read = recv(fd, (void *)tcp->read_pos, tcp->to_read, 0); if (read < 0) { - if (_getdns_socketerror() == _getdns_EWOULDBLOCK) - return STUB_TCP_WOULDBLOCK; + if (_getdns_socket_retry()) + return STUB_TCP_RETRY; else return STUB_TCP_ERROR; } else if (read == 0) { @@ -654,7 +653,7 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) tcp->read_pos += read; if (tcp->to_read > 0) - return STUB_TCP_AGAIN; + return STUB_TCP_MORE_TO_READ; read = tcp->read_pos - tcp->read_buf; if (read == 2) { @@ -679,14 +678,14 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } /* Ready to start reading the packet */ tcp->read_pos = tcp->read_buf; - return STUB_TCP_AGAIN; + return STUB_TCP_MORE_TO_READ; } return GLDNS_ID_WIRE(tcp->read_buf); } /* stub_tcp_write(fd, tcp, netreq) - * will return STUB_TCP_AGAIN when we need to come back again, - * STUB_TCP_ERROR on error and a query_id on successful sent. + * will return STUB_TCP_RETRY or STUB_TCP_MORE_TO_WRITE when we need to come + * back again, STUB_TCP_ERROR on error and a query_id on successful sent. */ static int stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) @@ -749,7 +748,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) netreq->upstream->addr_len); /* If pipelining we will find that the connection is already up so just fall back to a 'normal' write. */ - if (written == -1 && errno == EISCONN) + if (written == -1 && _getdns_socketerror() == _getdns_EISCONN) written = write(fd, netreq->query - 2, pkt_len + 2); #else written = sendto(fd, (const char *)(netreq->query - 2), @@ -757,27 +756,24 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) (struct sockaddr *)&(netreq->upstream->addr), netreq->upstream->addr_len); #endif - if ((written < 0 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || - /* Add the error case where the connection is in progress which is when - a cookie is not available (e.g. when doing the first request to an - upstream). We must let the handshake complete since non-blocking. */ - _getdns_socketerror() == _getdns_EINPROGRESS)) || - (size_t)written < pkt_len + 2) { + if ((written == -1 && _getdns_socket_retry()) || + (size_t)written < pkt_len + 2) { /* We couldn't write the whole packet. - * We have to return with STUB_TCP_AGAIN. * Setup tcp to track the state. */ tcp->write_buf = netreq->query - 2; tcp->write_buf_len = pkt_len + 2; tcp->written = written >= 0 ? written : 0; - return STUB_TCP_WOULDBLOCK; + return written == -1 + ? STUB_TCP_RETRY + : STUB_TCP_MORE_TO_WRITE; } else if (written == -1) { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" " %s\n", STUB_DEBUG_WRITE, __FUNC__, (void*)netreq - , strerror(errno)); + , _getdns_errnostr()); return STUB_TCP_ERROR; } @@ -792,12 +788,12 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) written = send(fd, (void *)(tcp->write_buf + tcp->written), tcp->write_buf_len - tcp->written, 0); if (written == -1) { - if (_getdns_socketerror() == _getdns_EWOULDBLOCK) - return STUB_TCP_WOULDBLOCK; + if (_getdns_socket_retry()) + return STUB_TCP_RETRY; else { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" " %s\n", STUB_DEBUG_WRITE, __FUNC__, (void*)netreq - , strerror(errno)); + , _getdns_errnostr()); return STUB_TCP_ERROR; } @@ -805,7 +801,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) tcp->written += written; if (tcp->written < tcp->write_buf_len) /* Still more to send */ - return STUB_TCP_AGAIN; + return STUB_TCP_MORE_TO_WRITE; query_id = (int)GLDNS_ID_WIRE(tcp->write_buf + 2); /* Done. Start reading */ @@ -1029,7 +1025,7 @@ tls_do_handshake(getdns_upstream *upstream) GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, TIMEOUT_TLS, &upstream->event); upstream->tls_hs_state = GETDNS_HS_READ; - return STUB_TCP_AGAIN; + return STUB_TCP_RETRY; case SSL_ERROR_WANT_WRITE: GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); upstream->event.read_cb = NULL; @@ -1037,7 +1033,7 @@ tls_do_handshake(getdns_upstream *upstream) GETDNS_SCHEDULE_EVENT(upstream->loop, upstream->fd, TIMEOUT_TLS, &upstream->event); upstream->tls_hs_state = GETDNS_HS_WRITE; - return STUB_TCP_AGAIN; + return STUB_TCP_RETRY; default: DEBUG_STUB("%s %-35s: FD: %d Handshake failed %d\n", STUB_DEBUG_SETUP_TLS, __FUNC__, upstream->fd, @@ -1121,7 +1117,7 @@ stub_tls_read(getdns_upstream *upstream, getdns_tcp_state *tcp, renegotiation. Need to keep handshake state to do that.*/ int want = SSL_get_error(tls_obj, read); if (want == SSL_ERROR_WANT_READ) { - return STUB_TCP_AGAIN; /* read more later */ + return STUB_TCP_RETRY; /* Come back later */ } else return STUB_TCP_ERROR; } @@ -1129,7 +1125,7 @@ stub_tls_read(getdns_upstream *upstream, getdns_tcp_state *tcp, tcp->read_pos += read; if ((int)tcp->to_read > 0) - return STUB_TCP_AGAIN; + return STUB_TCP_MORE_TO_READ; read = tcp->read_pos - tcp->read_buf; if (read == 2) { @@ -1161,14 +1157,14 @@ stub_tls_read(getdns_upstream *upstream, getdns_tcp_state *tcp, renegotiation. Need to keep handshake state to do that.*/ int want = SSL_get_error(tls_obj, read); if (want == SSL_ERROR_WANT_READ) { - return STUB_TCP_AGAIN; /* read more later */ + return STUB_TCP_RETRY; /* read more later */ } else return STUB_TCP_ERROR; } tcp->to_read -= read; tcp->read_pos += read; if ((int)tcp->to_read > 0) - return STUB_TCP_AGAIN; + return STUB_TCP_MORE_TO_READ; } return GLDNS_ID_WIRE(tcp->read_buf); } @@ -1285,7 +1281,7 @@ stub_tls_write(getdns_upstream *upstream, getdns_tcp_state *tcp, switch (SSL_get_error(tls_obj, written)) { case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: - return STUB_TCP_AGAIN; + return STUB_TCP_RETRY; default: return STUB_TCP_ERROR; } @@ -1335,14 +1331,14 @@ stub_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && (_getdns_socketerror() == _getdns_EWOULDBLOCK || + if (read == -1 && (_getdns_socket_retry() || _getdns_socketerror() == _getdns_ECONNRESET)) return; /* Try again later */ if (read == -1) { DEBUG_STUB("%s %-35s: MSG: %p error while reading from socket:" " %s\n", STUB_DEBUG_READ, __FUNC__, (void*)netreq - , strerror(errno)); + , _getdns_errnostr()); stub_cleanup(netreq); _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); @@ -1451,7 +1447,7 @@ stub_udp_write_cb(void *userarg) if (written == -1) DEBUG_STUB( "%s %-35s: MSG: %p error: %s\n" , STUB_DEBUG_WRITE, __FUNC__, (void *)netreq - , strerror(errno)); + , _getdns_errnostr()); else DEBUG_STUB( "%s %-35s: MSG: %p returned: %d, expeced: %d\n" , STUB_DEBUG_WRITE, __FUNC__, (void *)netreq @@ -1517,10 +1513,10 @@ upstream_read_cb(void *userarg) &upstream->upstreams->mf); switch (q) { - case STUB_TCP_AGAIN: + case STUB_TCP_MORE_TO_READ: /* WSA TODO: if callback is still upstream_read_cb, do it again */ - case STUB_TCP_WOULDBLOCK: + case STUB_TCP_RETRY: return; case STUB_SETUP_ERROR: /* Can happen for TLS HS*/ case STUB_TCP_ERROR: @@ -1648,10 +1644,10 @@ upstream_write_cb(void *userarg) q = stub_tcp_write(upstream->fd, &upstream->tcp, netreq); switch (q) { - case STUB_TCP_AGAIN: + case STUB_TCP_MORE_TO_WRITE: /* WSA TODO: if callback is still upstream_write_cb, do it again */ - case STUB_TCP_WOULDBLOCK: + case STUB_TCP_RETRY: return; case STUB_OUT_OF_OPTIONS: case STUB_TCP_ERROR: diff --git a/src/test/check_getdns_common.c b/src/test/check_getdns_common.c index 8fe9f8c6..af894be5 100644 --- a/src/test/check_getdns_common.c +++ b/src/test/check_getdns_common.c @@ -217,6 +217,7 @@ void assert_address_in_answer(struct extracted_response *ex_response, int a, int case GETDNS_RRTYPE_A: if(a && type == GETDNS_RRTYPE_A) address_records++; + /* fallthrough */ case GETDNS_RRTYPE_AAAA: if(aaaa && type == GETDNS_RRTYPE_AAAA) address_records++; From 3b7b83e309e98762d2ebe71cb29d35b4ec3bcc49 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 15:41:31 +0100 Subject: [PATCH 48/59] Review comments from Jim --- src/anchor.c | 4 ++-- src/platform.c | 28 +--------------------------- src/platform.h | 8 ++++++-- src/server.c | 10 +++++----- src/stub.c | 8 ++++---- 5 files changed, 18 insertions(+), 40 deletions(-) diff --git a/src/anchor.c b/src/anchor.c index 6d3877e0..7f992a5c 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -1199,7 +1199,7 @@ static void tas_read_cb(void *userarg) return; } } - } else if (_getdns_socket_retry()) + } else if (_getdns_socket_wants_retry()) return; DEBUG_ANCHOR("Read error: %d %s\n", (int)n, _getdns_errnostr()); @@ -1249,7 +1249,7 @@ static void tas_write_cb(void *userarg) tas_read_cb, NULL, tas_timeout_cb)); return; - } else if (_getdns_socket_retry()) + } else if (_getdns_socket_wants_retry()) return; DEBUG_ANCHOR("Write error: %s\n", _getdns_errnostr()); diff --git a/src/platform.c b/src/platform.c index aad62d63..49a7e225 100644 --- a/src/platform.c +++ b/src/platform.c @@ -147,32 +147,6 @@ const char *_getdns_strerror(DWORD errnum) case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; - case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize."; - case WSASYSCALLFAILURE: return "System call failure."; - case WSASERVICE_NOT_FOUND: return "Service not found."; - case WSATYPE_NOT_FOUND: return "Class type not found."; - case WSA_E_NO_MORE: return "No more results."; - case WSA_E_CANCELLED: return "Call was canceled."; - case WSAEREFUSED: return "Database query was refused."; - case WSAHOST_NOT_FOUND: return "Host not found."; - case WSATRY_AGAIN: return "Nonauthoritative host not found."; - case WSANO_RECOVERY: return "This is a nonrecoverable error."; - case WSANO_DATA: return "Valid name, no data record of requested type."; - case WSA_QOS_RECEIVERS: return "QOS receivers."; - case WSA_QOS_SENDERS: return "QOS senders."; - case WSA_QOS_NO_SENDERS: return "No QOS senders."; - case WSA_QOS_NO_RECEIVERS: return "QOS no receivers."; - case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed."; - case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error."; - case WSA_QOS_POLICY_FAILURE: return "QOS policy failure."; - case WSA_QOS_BAD_STYLE: return "QOS bad style."; - case WSA_QOS_BAD_OBJECT: return "QOS bad object."; - case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error."; - case WSA_QOS_GENERIC_ERROR: return "QOS generic error."; - case WSA_QOS_ESERVICETYPE: return "QOS service type error."; - case WSA_QOS_EFLOWSPEC: return "QOS flowspec error."; - case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer."; - case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style."; case WSA_QOS_EFILTERTYPE: return "Invalid QOS filter type."; case WSA_QOS_EFILTERCOUNT: return "Incorrect QOS filter count."; case WSA_QOS_EOBJLENGTH: return "Invalid QOS object length."; @@ -187,7 +161,7 @@ const char *_getdns_strerror(DWORD errnum) case WSA_QOS_RESERVED_PETYPE: return "Reserved policy QOS element type."; default: snprintf(unknown, sizeof(unknown), - "unknown WSA error code %d", (int)err); + "unknown WSA error code %d", (int)errnum); return unknown; } } diff --git a/src/platform.h b/src/platform.h index d2b69da5..940d0f6e 100644 --- a/src/platform.h +++ b/src/platform.h @@ -46,7 +46,11 @@ typedef u_short sa_family_t; #define _getdns_ENOBUFS (WSAENOBUFS) #define _getdns_EPROTO (0) #define _getdns_EMFILE (WSAEMFILE) -#define _getdns_ENFILE (WSAENFILE) +#ifdef WSAENFILE +# define _getdns_ENFILE (WSAENFILE) +#else +# define _getdns_ENFILE (0) +#endif #define _getdns_ECONNRESET (WSAECONNRESET) #define _getdns_ECONNABORTED (0) #define _getdns_EISCONN (WSAEISCONN) @@ -138,7 +142,7 @@ void _getdns_perror(const char *str); || (X) == _getdns_EWOULDBLOCK \ || (X) == _getdns_EINPROGRESS \ || (X) == _getdns_ENOBUFS ) -#define _getdns_socket_retry() (_getdns_errno_retry(_getdns_socketerror())) +#define _getdns_socket_wants_retry() (_getdns_errno_retry(_getdns_socketerror())) #define _getdns_resource_depletion() ( _getdns_socketerror() == _getdns_ENFILE \ || _getdns_socketerror() == _getdns_EMFILE ) diff --git a/src/server.c b/src/server.c index 28aa9052..7bbda6eb 100644 --- a/src/server.c +++ b/src/server.c @@ -191,7 +191,7 @@ static void tcp_write_cb(void *userarg) (const void *)&to_write->write_buf[to_write->written], to_write->write_buf_len - to_write->written, 0)) == -1) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return; DEBUG_SERVER("I/O error from send(): %s\n", @@ -287,7 +287,7 @@ getdns_reply( if (conn->l->fd >= 0 && sendto(conn->l->fd, (void *)buf, len, 0, (struct sockaddr *)&conn->remote_in, conn->addrlen) == -1) { - /* TODO: handle _getdns_socket_retry() */ + /* TODO: handle _getdns_socket_wants_retry() */ /* IO error, never cleanup a listener because of I/O error */ DEBUG_SERVER("I/O error from sendto(): %s\n", @@ -371,7 +371,7 @@ static void tcp_read_cb(void *userarg) if ((bytes_read = recv(conn->fd, (void *)conn->read_pos, conn->to_read, 0)) < 0) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return; /* Come back to do the read later */ /* IO error, close connection */ @@ -486,7 +486,7 @@ static void tcp_accept_cb(void *userarg) if ((conn->fd = accept(l->fd, (struct sockaddr *) &conn->super.remote_in, &conn->super.addrlen)) == -1) { - if (_getdns_socket_retry() || + if (_getdns_socket_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET) ; /* pass */ @@ -564,7 +564,7 @@ static void udp_read_cb(void *userarg) conn->addrlen = sizeof(conn->remote_in); if ((len = recvfrom(l->fd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { - if ( _getdns_socket_retry() && + if ( _getdns_socket_wants_retry() && _getdns_socketerror() != _getdns_ECONNRESET) { /* * WINSOCK gives ECONNRESET on ICMP Port Unreachable diff --git a/src/stub.c b/src/stub.c index e9089291..247862d6 100644 --- a/src/stub.c +++ b/src/stub.c @@ -638,7 +638,7 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } read = recv(fd, (void *)tcp->read_pos, tcp->to_read, 0); if (read < 0) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return STUB_TCP_RETRY; else return STUB_TCP_ERROR; @@ -756,7 +756,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) (struct sockaddr *)&(netreq->upstream->addr), netreq->upstream->addr_len); #endif - if ((written == -1 && _getdns_socket_retry()) || + if ((written == -1 && _getdns_socket_wants_retry()) || (size_t)written < pkt_len + 2) { /* We couldn't write the whole packet. @@ -788,7 +788,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) written = send(fd, (void *)(tcp->write_buf + tcp->written), tcp->write_buf_len - tcp->written, 0); if (written == -1) { - if (_getdns_socket_retry()) + if (_getdns_socket_wants_retry()) return STUB_TCP_RETRY; else { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" @@ -1331,7 +1331,7 @@ stub_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && (_getdns_socket_retry() || + if (read == -1 && (_getdns_socket_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET)) return; /* Try again later */ From 4508ec77fbb4bf7a5148088e2736b87994355664 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 16:26:19 +0100 Subject: [PATCH 49/59] Few more renames --- src/extension/select_eventloop.c | 2 +- src/platform.h | 12 ++++++------ src/stub.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 0b7b3592..2b0ddf21 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -245,7 +245,7 @@ select_eventloop_run_once(getdns_eventloop *loop, int blocking) #endif if (select(max_fd + 1, &readfds, &writefds, NULL, (timeout == TIMEOUT_FOREVER ? NULL : &tv)) < 0) { - if (_getdns_socket_retr()) + if (_getdns_socket_wants_retry()) return; DEBUG_SCHED("I/O error with select(): %s\n", _getdns_errnostr()); diff --git a/src/platform.h b/src/platform.h index 940d0f6e..952668c6 100644 --- a/src/platform.h +++ b/src/platform.h @@ -137,12 +137,12 @@ const char *_getdns_strerror(int errnum); void _getdns_perror(const char *str); #define _getdns_errnostr() (_getdns_strerror(_getdns_socketerror())) -#define _getdns_errno_retry(X) ( (X) == _getdns_EINTR \ - || (X) == _getdns_EAGAIN \ - || (X) == _getdns_EWOULDBLOCK \ - || (X) == _getdns_EINPROGRESS \ - || (X) == _getdns_ENOBUFS ) -#define _getdns_socket_wants_retry() (_getdns_errno_retry(_getdns_socketerror())) +#define _getdns_error_wants_retry(X) ( (X) == _getdns_EINTR \ + || (X) == _getdns_EAGAIN \ + || (X) == _getdns_EWOULDBLOCK \ + || (X) == _getdns_EINPROGRESS \ + || (X) == _getdns_ENOBUFS ) +#define _getdns_socket_wants_retry() (_getdns_error_wants_retry(_getdns_socketerror())) #define _getdns_resource_depletion() ( _getdns_socketerror() == _getdns_ENFILE \ || _getdns_socketerror() == _getdns_EMFILE ) diff --git a/src/stub.c b/src/stub.c index 247862d6..bb46e5b0 100644 --- a/src/stub.c +++ b/src/stub.c @@ -430,7 +430,7 @@ tcp_connected(getdns_upstream *upstream) { int error = 0; socklen_t len = (socklen_t)sizeof(error); getsockopt(upstream->fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len); - if (_getdns_errno_retry(error)) + if (_getdns_error_wants_retry(error)) return STUB_TCP_RETRY; else if (error != 0) { return STUB_SETUP_ERROR; From 9b019b8c6e86d2620bb09ca3ba48513b83663d2e Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 16:29:43 +0100 Subject: [PATCH 50/59] Check errno is not 0 before testing errors --- src/platform.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/platform.h b/src/platform.h index 952668c6..ffff4c97 100644 --- a/src/platform.h +++ b/src/platform.h @@ -137,13 +137,15 @@ const char *_getdns_strerror(int errnum); void _getdns_perror(const char *str); #define _getdns_errnostr() (_getdns_strerror(_getdns_socketerror())) -#define _getdns_error_wants_retry(X) ( (X) == _getdns_EINTR \ - || (X) == _getdns_EAGAIN \ - || (X) == _getdns_EWOULDBLOCK \ - || (X) == _getdns_EINPROGRESS \ - || (X) == _getdns_ENOBUFS ) +#define _getdns_error_wants_retry(X) ( (X) != 0 \ + && ( (X) == _getdns_EINTR \ + || (X) == _getdns_EAGAIN \ + || (X) == _getdns_EWOULDBLOCK \ + || (X) == _getdns_EINPROGRESS \ + || (X) == _getdns_ENOBUFS )) #define _getdns_socket_wants_retry() (_getdns_error_wants_retry(_getdns_socketerror())) -#define _getdns_resource_depletion() ( _getdns_socketerror() == _getdns_ENFILE \ - || _getdns_socketerror() == _getdns_EMFILE ) +#define _getdns_resource_depletion() ( _getdns_socketerror() != 0 \ + && ( _getdns_socketerror() == _getdns_ENFILE \ + || _getdns_socketerror() == _getdns_EMFILE )) #endif From 439f41149b34f4df4feb19bc7063f30831835022 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 16:42:38 +0100 Subject: [PATCH 51/59] Last rename + explicit EMFILE check replacement --- src/anchor.c | 4 ++-- src/extension/select_eventloop.c | 2 +- src/platform.h | 2 +- src/server.c | 10 +++++----- src/stub.c | 10 +++++----- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/anchor.c b/src/anchor.c index 7f992a5c..006e5da4 100644 --- a/src/anchor.c +++ b/src/anchor.c @@ -1199,7 +1199,7 @@ static void tas_read_cb(void *userarg) return; } } - } else if (_getdns_socket_wants_retry()) + } else if (_getdns_socketerror_wants_retry()) return; DEBUG_ANCHOR("Read error: %d %s\n", (int)n, _getdns_errnostr()); @@ -1249,7 +1249,7 @@ static void tas_write_cb(void *userarg) tas_read_cb, NULL, tas_timeout_cb)); return; - } else if (_getdns_socket_wants_retry()) + } else if (_getdns_socketerror_wants_retry()) return; DEBUG_ANCHOR("Write error: %s\n", _getdns_errnostr()); diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 2b0ddf21..7855c21d 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -245,7 +245,7 @@ select_eventloop_run_once(getdns_eventloop *loop, int blocking) #endif if (select(max_fd + 1, &readfds, &writefds, NULL, (timeout == TIMEOUT_FOREVER ? NULL : &tv)) < 0) { - if (_getdns_socket_wants_retry()) + if (_getdns_socketerror_wants_retry()) return; DEBUG_SCHED("I/O error with select(): %s\n", _getdns_errnostr()); diff --git a/src/platform.h b/src/platform.h index ffff4c97..ddfb9575 100644 --- a/src/platform.h +++ b/src/platform.h @@ -143,7 +143,7 @@ void _getdns_perror(const char *str); || (X) == _getdns_EWOULDBLOCK \ || (X) == _getdns_EINPROGRESS \ || (X) == _getdns_ENOBUFS )) -#define _getdns_socket_wants_retry() (_getdns_error_wants_retry(_getdns_socketerror())) +#define _getdns_socketerror_wants_retry() (_getdns_error_wants_retry(_getdns_socketerror())) #define _getdns_resource_depletion() ( _getdns_socketerror() != 0 \ && ( _getdns_socketerror() == _getdns_ENFILE \ || _getdns_socketerror() == _getdns_EMFILE )) diff --git a/src/server.c b/src/server.c index 7bbda6eb..ef5676f8 100644 --- a/src/server.c +++ b/src/server.c @@ -191,7 +191,7 @@ static void tcp_write_cb(void *userarg) (const void *)&to_write->write_buf[to_write->written], to_write->write_buf_len - to_write->written, 0)) == -1) { - if (_getdns_socket_wants_retry()) + if (_getdns_socketerror_wants_retry()) return; DEBUG_SERVER("I/O error from send(): %s\n", @@ -287,7 +287,7 @@ getdns_reply( if (conn->l->fd >= 0 && sendto(conn->l->fd, (void *)buf, len, 0, (struct sockaddr *)&conn->remote_in, conn->addrlen) == -1) { - /* TODO: handle _getdns_socket_wants_retry() */ + /* TODO: handle _getdns_socketerror_wants_retry() */ /* IO error, never cleanup a listener because of I/O error */ DEBUG_SERVER("I/O error from sendto(): %s\n", @@ -371,7 +371,7 @@ static void tcp_read_cb(void *userarg) if ((bytes_read = recv(conn->fd, (void *)conn->read_pos, conn->to_read, 0)) < 0) { - if (_getdns_socket_wants_retry()) + if (_getdns_socketerror_wants_retry()) return; /* Come back to do the read later */ /* IO error, close connection */ @@ -486,7 +486,7 @@ static void tcp_accept_cb(void *userarg) if ((conn->fd = accept(l->fd, (struct sockaddr *) &conn->super.remote_in, &conn->super.addrlen)) == -1) { - if (_getdns_socket_wants_retry() || + if (_getdns_socketerror_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET) ; /* pass */ @@ -564,7 +564,7 @@ static void udp_read_cb(void *userarg) conn->addrlen = sizeof(conn->remote_in); if ((len = recvfrom(l->fd, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&conn->remote_in, &conn->addrlen)) == -1) { - if ( _getdns_socket_wants_retry() && + if ( _getdns_socketerror_wants_retry() && _getdns_socketerror() != _getdns_ECONNRESET) { /* * WINSOCK gives ECONNRESET on ICMP Port Unreachable diff --git a/src/stub.c b/src/stub.c index bb46e5b0..10745928 100644 --- a/src/stub.c +++ b/src/stub.c @@ -638,7 +638,7 @@ stub_tcp_read(int fd, getdns_tcp_state *tcp, struct mem_funcs *mf) } read = recv(fd, (void *)tcp->read_pos, tcp->to_read, 0); if (read < 0) { - if (_getdns_socket_wants_retry()) + if (_getdns_socketerror_wants_retry()) return STUB_TCP_RETRY; else return STUB_TCP_ERROR; @@ -756,7 +756,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) (struct sockaddr *)&(netreq->upstream->addr), netreq->upstream->addr_len); #endif - if ((written == -1 && _getdns_socket_wants_retry()) || + if ((written == -1 && _getdns_socketerror_wants_retry()) || (size_t)written < pkt_len + 2) { /* We couldn't write the whole packet. @@ -788,7 +788,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) written = send(fd, (void *)(tcp->write_buf + tcp->written), tcp->write_buf_len - tcp->written, 0); if (written == -1) { - if (_getdns_socket_wants_retry()) + if (_getdns_socketerror_wants_retry()) return STUB_TCP_RETRY; else { DEBUG_STUB("%s %-35s: MSG: %p error while writing to TCP socket:" @@ -1331,7 +1331,7 @@ stub_udp_read_cb(void *userarg) * i.e. overflow */ 0, NULL, NULL); - if (read == -1 && (_getdns_socket_wants_retry() || + if (read == -1 && (_getdns_socketerror_wants_retry() || _getdns_socketerror() == _getdns_ECONNRESET)) return; /* Try again later */ @@ -2060,7 +2060,7 @@ upstream_find_for_netreq(getdns_network_req *netreq) continue; if (fd == -1) { - if (_getdns_socketerror() == _getdns_EMFILE) + if (_getdns_resource_depletion()) return STUB_TRY_AGAIN_LATER; return -1; } From f6517fd3e224d2b41a9eb3ec4fce59275b8e8c5c Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 20:12:28 +0100 Subject: [PATCH 52/59] Update Stubby to v0.1.5 --- stubby | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubby b/stubby index 0cbd46ea..daa9dc64 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit 0cbd46ea6d0da727c42b0890d498366cd2b1ec2c +Subproject commit daa9dc64c0f4c574d18f8eb1a38705ddf9a26346 From 5fe979c2e69aecef67a36cc401507658469b9c13 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 3 Nov 2017 20:26:45 +0100 Subject: [PATCH 53/59] Update ChangeLog and configure.ac --- ChangeLog | 5 ++++- configure.ac | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a8cd440..46e0d345 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -* 2017-1?-??: Version 1.2.1 +* 2017-11-??: Version 1.2.1 + * Handle more I/O error cases. Also, when an I/O error does occur, + never stop listening (with servers), and + never exit (when running the built-in event loop). * Bugfix: Tolerate unsigned and unused RRsets in the authority section. Fixes DNSSEC with BIND upstream. * Bugfix: DNSSEC validation without support records diff --git a/configure.ac b/configure.ac index 07b7f708..9d652c6d 100644 --- a/configure.ac +++ b/configure.ac @@ -36,7 +36,7 @@ sinclude(./m4/acx_getaddrinfo.m4) sinclude(./m4/ax_check_compile_flag.m4) sinclude(./m4/pkg.m4) -AC_INIT([getdns], [1.2.1], [users@getdnsapi.net], [], [https://getdnsapi.net]) +AC_INIT([getdns], [1.2.1], [team@getdnsapi.net], [getdns], [https://getdnsapi.net]) # Autoconf 2.70 will have set up runstatedir. 2.69 is frequently (Debian) # patched to do the same, but frequently (MacOS) not. So add a with option @@ -52,7 +52,7 @@ AC_SUBST([runstatedir], [$with_piddir]) # Dont forget to put a dash in front of the release candidate!!! # That is how it is done with semantic versioning! # -AC_SUBST(RELEASE_CANDIDATE, [rc1]) +AC_SUBST(RELEASE_CANDIDATE, [-rc1]) # Set current date from system if not set AC_ARG_WITH([current-date], From 26eb5b8969f36d7c0c78d05fa07aeac17bf030aa Mon Sep 17 00:00:00 2001 From: Sara Dickinson Date: Wed, 8 Nov 2017 11:38:52 +0000 Subject: [PATCH 54/59] Add DESTDIR to runstatedir creation path --- src/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.in b/src/Makefile.in index 7ea9bcf1..a84dbf16 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -223,7 +223,7 @@ install-stubby-files-windows: stubby.yml.windows install-stubby: stubby install-stubby-files-@HOSTOS@ $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) $(LIBTOOL) --mode=install cp stubby $(DESTDIR)$(bindir) - $(INSTALL) -m 755 -d $(runstatedir) + $(INSTALL) -m 755 -d $(DESTDIR)$(runstatedir) uninstall-stubby: $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(bindir)/stubby From 6f20016889214d0fdc22b5fce816b5b1d66a6b39 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 10 Nov 2017 10:35:41 +0100 Subject: [PATCH 55/59] default_trust_anchor_location in api_information instead of trust_anchor_file --- src/context.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/context.c b/src/context.c index 994a9ac4..62678873 100644 --- a/src/context.c +++ b/src/context.c @@ -3903,7 +3903,7 @@ getdns_context_get_api_information(getdns_context* context) result, "compilation_comment", GETDNS_COMPILATION_COMMENT) && ! getdns_dict_util_set_string( - result, "trust_anchor_file", TRUST_ANCHOR_FILE) + result, "default_trust_anchor_location", TRUST_ANCHOR_FILE) && ! getdns_dict_set_int( result, "resolution_type", context->resolution_type) @@ -4623,6 +4623,7 @@ _getdns_context_config_setting(getdns_context *context, && !_streq(setting, "api_version_string") && !_streq(setting, "api_version_number") && !_streq(setting, "trust_anchor_file") + && !_streq(setting, "default_trust_anchor_location") && !_streq(setting, "compilation_comment") ) { r = GETDNS_RETURN_NOT_IMPLEMENTED; From 260416a8598304a8a04cb2188e32e6688833b94a Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Fri, 10 Nov 2017 10:42:17 +0100 Subject: [PATCH 56/59] Ignore SIGPIPE signal (for not suddenly stopping) --- src/tools/getdns_query.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/tools/getdns_query.c b/src/tools/getdns_query.c index 53e546e2..a9b4b96d 100644 --- a/src/tools/getdns_query.c +++ b/src/tools/getdns_query.c @@ -46,6 +46,10 @@ typedef unsigned short in_port_t; #include #endif +#ifdef HAVE_SIGNAL_H +#include +#endif + #ifdef HAVE_GETDNS_YAML2DICT getdns_return_t getdns_yaml2dict(const char *, getdns_dict **dict); #endif @@ -1794,27 +1798,10 @@ main(int argc, char **argv) } else if (listen_count) { assert(loop); -#ifndef GETDNS_ON_WINDOWS - if (i_am_stubby && !run_in_foreground) { - pid_t pid = fork(); - if (pid == -1) { - perror("Could not fork of stubby daemon\n"); - r = GETDNS_RETURN_GENERIC_ERROR; - - } else if (pid) { - FILE *fh = fopen("/var/rub/stubby.pid", "w"); - if (! fh) - fh = fopen("/tmp/stubby.pid", "w"); - if (fh) { - fprintf(fh, "%d", (int)pid); - fclose(fh); - batch_mode = 0; - } - } else - loop->vmt->run(loop); - } else +#ifdef SIGPIPE + (void) signal(SIGPIPE, SIG_IGN); #endif - loop->vmt->run(loop); + loop->vmt->run(loop); } else r = do_the_call(); From 6aa732b54dfaa4e9eaf4f4ece46874d334f01a19 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Sat, 11 Nov 2017 00:26:18 +0800 Subject: [PATCH 57/59] Update Stubby --- stubby | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubby b/stubby index daa9dc64..a43be56e 160000 --- a/stubby +++ b/stubby @@ -1 +1 @@ -Subproject commit daa9dc64c0f4c574d18f8eb1a38705ddf9a26346 +Subproject commit a43be56e28f3a802f74b7c5b19b4b4c5fbaa908a From bf034eb3cd088469089097458fad773e39574259 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Sat, 11 Nov 2017 00:28:17 +0800 Subject: [PATCH 58/59] Bump version --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 9d652c6d..01dcbdb9 100644 --- a/configure.ac +++ b/configure.ac @@ -52,7 +52,7 @@ AC_SUBST([runstatedir], [$with_piddir]) # Dont forget to put a dash in front of the release candidate!!! # That is how it is done with semantic versioning! # -AC_SUBST(RELEASE_CANDIDATE, [-rc1]) +AC_SUBST(RELEASE_CANDIDATE, []) # Set current date from system if not set AC_ARG_WITH([current-date], @@ -62,7 +62,7 @@ AC_ARG_WITH([current-date], [CURRENT_DATE="`date -u +%Y-%m-%dT%H:%M:%SZ`"]) AC_SUBST(GETDNS_VERSION, ["AC_PACKAGE_VERSION$RELEASE_CANDIDATE"]) -AC_SUBST(GETDNS_NUMERIC_VERSION, [0x010200C1]) +AC_SUBST(GETDNS_NUMERIC_VERSION, [0x01020100]) AC_SUBST(API_VERSION, ["December 2015"]) AC_SUBST(API_NUMERIC_VERSION, [0x07df0c00]) GETDNS_COMPILATION_COMMENT="AC_PACKAGE_NAME $GETDNS_VERSION configured on $CURRENT_DATE for the $API_VERSION version of the API" @@ -98,7 +98,7 @@ GETDNS_COMPILATION_COMMENT="AC_PACKAGE_NAME $GETDNS_VERSION configured on $CURRE # getdns-1.1.2 had libversion 7:0:1 # getdns-1.1.3 had libversion 7:1:1 # getdns-1.2.0 had libversion 8:0:2 -# getdns-1.2.1 will have libversion 8:1:2 +# getdns-1.2.1 has libversion 8:1:2 # GETDNS_LIBVERSION=8:1:2 From f2f08514ce6d0255270ed550b28ce777c8efdf44 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Sat, 11 Nov 2017 00:42:25 +0800 Subject: [PATCH 59/59] Set date in ChangeLog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 46e0d345..69d8872b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -* 2017-11-??: Version 1.2.1 +* 2017-11-11: Version 1.2.1 * Handle more I/O error cases. Also, when an I/O error does occur, never stop listening (with servers), and never exit (when running the built-in event loop).