diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile index 97cdc1d5e1..37da3c3007 100644 --- a/package/network/services/dnsmasq/Makefile +++ b/package/network/services/dnsmasq/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dnsmasq -PKG_VERSION:=2.80test3 -PKG_RELEASE:=1 +PKG_VERSION:=2.80test6 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/test-releases -PKG_HASH:=af9f6fd13e0d6c5a68059bcf8634c2784c0533017fd48fbaf59cd2955342d301 +PKG_HASH:=aa74384f4ee6941d7785db79cf50fd6399cb992d219fc07ea6affeabe63b0190 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=COPYING @@ -53,6 +53,7 @@ $(call Package/dnsmasq/Default) TITLE += (with DHCPv6 support) DEPENDS+=@IPV6 VARIANT:=dhcpv6 + PROVIDES:=dnsmasq endef define Package/dnsmasq-full @@ -62,6 +63,7 @@ $(call Package/dnsmasq/Default) +PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset \ +PACKAGE_dnsmasq_full_conntrack:libnetfilter-conntrack VARIANT:=full + PROVIDES:=dnsmasq endef define Package/dnsmasq/description @@ -122,7 +124,8 @@ Package/dnsmasq-full/conffiles = $(Package/dnsmasq/conffiles) TARGET_CFLAGS += -ffunction-sections -fdata-sections TARGET_LDFLAGS += -Wl,--gc-sections -COPTS = $(if $(CONFIG_IPV6),,-DNO_IPV6) +COPTS = -DHAVE_UBUS \ + $(if $(CONFIG_IPV6),,-DNO_IPV6) ifeq ($(BUILD_VARIANT),nodhcpv6) COPTS += -DNO_DHCP6 diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init index c1ae0934fd..de15552424 100644 --- a/package/network/services/dnsmasq/files/dnsmasq.init +++ b/package/network/services/dnsmasq/files/dnsmasq.init @@ -813,6 +813,7 @@ dnsmasq_start() append_bool "$cfg" localise_queries "--localise-queries" append_bool "$cfg" readethers "--read-ethers" append_bool "$cfg" dbus "--enable-dbus" + append_bool "$cfg" ubus "--enable-ubus" 1 append_bool "$cfg" expandhosts "--expand-hosts" config_get tftp_root "$cfg" "tftp_root" [ -n "$tftp_root" ] && mkdir -p "$tftp_root" && append_bool "$cfg" enable_tftp "--enable-tftp" @@ -869,9 +870,6 @@ dnsmasq_start() ADD_LOCAL_FQDN="$ADD_LOCAL_HOSTNAME" fi - config_get_bool readethers "$cfg" readethers - [ "$readethers" = "1" -a \! -e "/etc/ethers" ] && touch /etc/ethers - config_get user_dhcpscript $cfg dhcpscript if has_handler || [ -n "$user_dhcpscript" ]; then xappend "--dhcp-script=$DHCPSCRIPT" diff --git a/package/network/services/dnsmasq/patches/0001-Handle-memory-allocation-failure-in-make_non_termina.patch b/package/network/services/dnsmasq/patches/0001-Handle-memory-allocation-failure-in-make_non_termina.patch new file mode 100644 index 0000000000..0590f47d9a --- /dev/null +++ b/package/network/services/dnsmasq/patches/0001-Handle-memory-allocation-failure-in-make_non_termina.patch @@ -0,0 +1,45 @@ +From ea6cc338042094f8023d224e53c244da158e6499 Mon Sep 17 00:00:00 2001 +From: Simon Kelley +Date: Tue, 18 Sep 2018 23:21:17 +0100 +Subject: [PATCH] Handle memory allocation failure in make_non_terminals() + +Thanks to Kristian Evensen for spotting the problem. + +Signed-off-by: Kevin Darbyshire-Bryant +--- + src/cache.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +--- a/src/cache.c ++++ b/src/cache.c +@@ -1360,7 +1360,7 @@ void cache_add_dhcp_entry(char *host_nam + static void make_non_terminals(struct crec *source) + { + char *name = cache_get_name(source); +- struct crec* crecp, *tmp, **up; ++ struct crec *crecp, *tmp, **up; + int type = F_HOSTS | F_CONFIG; + #ifdef HAVE_DHCP + if (source->flags & F_DHCP) +@@ -1434,12 +1434,15 @@ static void make_non_terminals(struct cr + #endif + crecp = whine_malloc(sizeof(struct crec)); + +- *crecp = *source; +- crecp->flags &= ~(F_IPV4 | F_IPV6 | F_CNAME | F_DNSKEY | F_DS | F_REVERSE); +- crecp->flags |= F_NAMEP; +- crecp->name.namep = name; +- +- cache_hash(crecp); ++ if (crecp) ++ { ++ *crecp = *source; ++ crecp->flags &= ~(F_IPV4 | F_IPV6 | F_CNAME | F_DNSKEY | F_DS | F_REVERSE); ++ crecp->flags |= F_NAMEP; ++ crecp->name.namep = name; ++ ++ cache_hash(crecp); ++ } + } + } + diff --git a/package/network/services/dnsmasq/patches/0002-Change-behavior-when-RD-bit-unset-in-queries.patch b/package/network/services/dnsmasq/patches/0002-Change-behavior-when-RD-bit-unset-in-queries.patch new file mode 100644 index 0000000000..4f787e3cd5 --- /dev/null +++ b/package/network/services/dnsmasq/patches/0002-Change-behavior-when-RD-bit-unset-in-queries.patch @@ -0,0 +1,54 @@ +From 4139298d287eb5c57f4aa53c459cb02fc5be2495 Mon Sep 17 00:00:00 2001 +From: Simon Kelley +Date: Wed, 19 Sep 2018 22:27:11 +0100 +Subject: [PATCH 2/2] Change behavior when RD bit unset in queries. + +Change anti cache-snooping behaviour with queries with the +recursion-desired bit unset. Instead to returning SERVFAIL, we +now always forward, and never answer from the cache. This +allows "dig +trace" command to work. + +Signed-off-by: Kevin Darbyshire-Bryant +--- + CHANGELOG | 7 ++++++- + src/rfc1035.c | 8 +++----- + 2 files changed, 9 insertions(+), 6 deletions(-) + +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -59,7 +59,12 @@ version 2.80 + Returning null addresses is a useful technique for ad-blocking. + Thanks to Peter Russell for the suggestion. + +- ++ Change anti cache-snooping behaviour with queries with the ++ recursion-desired bit unset. Instead to returning SERVFAIL, we ++ now always forward, and never answer from the cache. This ++ allows "dig +trace" command to work. ++ ++ + version 2.79 + Fix parsing of CNAME arguments, which are confused by extra spaces. + Thanks to Diego Aguirre for spotting the bug. +--- a/src/rfc1035.c ++++ b/src/rfc1035.c +@@ -1293,16 +1293,14 @@ size_t answer_request(struct dns_header + struct mx_srv_record *rec; + size_t len; + +- if (ntohs(header->ancount) != 0 || ++ /* never answer queries with RD unset, to avoid cache snooping. */ ++ if (!(header->hb3 & HB3_RD) || ++ ntohs(header->ancount) != 0 || + ntohs(header->nscount) != 0 || + ntohs(header->qdcount) == 0 || + OPCODE(header) != QUERY ) + return 0; + +- /* always servfail queries with RD unset, to avoid cache snooping. */ +- if (!(header->hb3 & HB3_RD)) +- return setup_reply(header, qlen, NULL, F_SERVFAIL, 0); +- + /* Don't return AD set if checking disabled. */ + if (header->hb4 & HB4_CD) + sec_data = 0; diff --git a/package/network/services/dnsmasq/patches/230-fix-poll-h-include-warning-on-musl.patch b/package/network/services/dnsmasq/patches/230-fix-poll-h-include-warning-on-musl.patch index 37b11abc1d..2501079b3f 100644 --- a/package/network/services/dnsmasq/patches/230-fix-poll-h-include-warning-on-musl.patch +++ b/package/network/services/dnsmasq/patches/230-fix-poll-h-include-warning-on-musl.patch @@ -7,7 +7,7 @@ Signed-off-by: Kevin Darbyshire-Bryant --- a/src/dnsmasq.h +++ b/src/dnsmasq.h -@@ -88,7 +88,7 @@ typedef unsigned long long u64; +@@ -95,7 +95,7 @@ typedef unsigned long long u64; #if defined(HAVE_SOLARIS_NETWORK) # include #endif diff --git a/package/network/services/dnsmasq/patches/240-ubus.patch b/package/network/services/dnsmasq/patches/240-ubus.patch deleted file mode 100644 index 2fa9f48d12..0000000000 --- a/package/network/services/dnsmasq/patches/240-ubus.patch +++ /dev/null @@ -1,128 +0,0 @@ ---- a/src/dnsmasq.c -+++ b/src/dnsmasq.c -@@ -19,6 +19,8 @@ - - #include "dnsmasq.h" - -+#include -+ - struct daemon *daemon; - - static volatile pid_t pid = 0; -@@ -32,6 +34,64 @@ static void fatal_event(struct event_des - static int read_event(int fd, struct event_desc *evp, char **msg); - static void poll_resolv(int force, int do_reload, time_t now); - -+static struct ubus_context *ubus; -+static struct blob_buf b; -+ -+static struct ubus_object_type ubus_object_type = { -+ .name = "dnsmasq", -+}; -+ -+static struct ubus_object ubus_object = { -+ .name = "dnsmasq", -+ .type = &ubus_object_type, -+}; -+ -+void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface) -+{ -+ if (!ubus || !ubus_object.has_subscribers) -+ return; -+ -+ blob_buf_init(&b, 0); -+ if (mac) -+ blobmsg_add_string(&b, "mac", mac); -+ if (ip) -+ blobmsg_add_string(&b, "ip", ip); -+ if (name) -+ blobmsg_add_string(&b, "name", name); -+ if (interface) -+ blobmsg_add_string(&b, "interface", interface); -+ ubus_notify(ubus, &ubus_object, type, b.head, -1); -+} -+ -+static void set_ubus_listeners(void) -+{ -+ if (!ubus) -+ return; -+ -+ poll_listen(ubus->sock.fd, POLLIN); -+ poll_listen(ubus->sock.fd, POLLERR); -+ poll_listen(ubus->sock.fd, POLLHUP); -+} -+ -+static void check_ubus_listeners() -+{ -+ if (!ubus) { -+ ubus = ubus_connect(NULL); -+ if (ubus) -+ ubus_add_object(ubus, &ubus_object); -+ else -+ return; -+ } -+ -+ if (poll_check(ubus->sock.fd, POLLIN)) -+ ubus_handle_event(ubus); -+ -+ if (poll_check(ubus->sock.fd, POLLHUP)) { -+ ubus_free(ubus); -+ ubus = NULL; -+ } -+} -+ - int main (int argc, char **argv) - { - int bind_fallback = 0; -@@ -949,6 +1009,7 @@ int main (int argc, char **argv) - set_dbus_listeners(); - #endif - -+ set_ubus_listeners(); - #ifdef HAVE_DHCP - if (daemon->dhcp || daemon->relay4) - { -@@ -1079,6 +1140,8 @@ int main (int argc, char **argv) - check_dbus_listeners(); - #endif - -+ check_ubus_listeners(); -+ - check_dns_listeners(now); - - #ifdef HAVE_TFTP ---- a/Makefile -+++ b/Makefile -@@ -85,7 +85,7 @@ all : $(BUILDDIR) - @cd $(BUILDDIR) && $(MAKE) \ - top="$(top)" \ - build_cflags="$(version) $(dbus_cflags) $(idn2_cflags) $(idn_cflags) $(ct_cflags) $(lua_cflags) $(nettle_cflags)" \ -- build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs)" \ -+ build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs) -lubox -lubus" \ - -f $(top)/Makefile dnsmasq - - mostly_clean : ---- a/src/dnsmasq.h -+++ b/src/dnsmasq.h -@@ -1445,6 +1445,8 @@ void emit_dbus_signal(int action, struct - # endif - #endif - -+void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface); -+ - /* ipset.c */ - #ifdef HAVE_IPSET - void ipset_init(void); ---- a/src/rfc2131.c -+++ b/src/rfc2131.c -@@ -1636,6 +1636,10 @@ static void log_packet(char *type, void - daemon->namebuff, - string ? string : "", - err ? err : ""); -+ if (!strcmp(type, "DHCPACK")) -+ ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); -+ else if (!strcmp(type, "DHCPRELEASE")) -+ ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); - } - - static void log_options(unsigned char *start, u32 xid)