summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Audia2026-06-13 09:59:25 +0000
committerJonas Jelonek2026-06-16 10:13:01 +0000
commit80d9abb3f7a498d31e133cad4c2e9b8da4a9494c (patch)
treedf6a6dc01665629724535dfa02d4db10c97c29b1
parent73079fa3f1dcd6b473ea4e6fecbdbe5c33fbfc16 (diff)
downloadopenwrt-80d9abb3f7a498d31e133cad4c2e9b8da4a9494c.tar.gz
backport: update dnsmasq to v2.93 from master
Wholesale drop of dnsmasq from master. (cherry picked from commit 117f10e9a216ac5342bd6e1f29787b3d179cba4c) Reference PR: https://github.com/openwrt/openwrt/pull/23669 Signed-off-by: John Audia <therealgraysky@proton.me> Link: https://github.com/openwrt/openwrt/pull/23766 Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
-rw-r--r--package/network/services/dnsmasq/Makefile8
-rw-r--r--package/network/services/dnsmasq/patches/001-CVE-2026-2291.patch29
-rw-r--r--package/network/services/dnsmasq/patches/002-CVE-2026-4890.dnsmasq-2.91.patch63
-rw-r--r--package/network/services/dnsmasq/patches/003-CVE-2026-4891.patch32
-rw-r--r--package/network/services/dnsmasq/patches/004-CVE-2026-4892.patch28
-rw-r--r--package/network/services/dnsmasq/patches/005-CVE-2026-4893.patch26
-rw-r--r--package/network/services/dnsmasq/patches/006-CVE-2026-5172.patch26
-rw-r--r--package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch15
-rw-r--r--package/network/services/dnsmasq/patches/200-ubus_dns.patch18
9 files changed, 22 insertions, 223 deletions
diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile
index 6a845df1f5..19ae7b7cd1 100644
--- a/package/network/services/dnsmasq/Makefile
+++ b/package/network/services/dnsmasq/Makefile
@@ -8,13 +8,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dnsmasq
-PKG_UPSTREAM_VERSION:=2.91
+PKG_UPSTREAM_VERSION:=2.93
PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION)))
-PKG_RELEASE:=3
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz
PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq/
-PKG_HASH:=f622682848b33677adb2b6ad08264618a2ae0a01da486a93fd8cd91186b3d153
+PKG_HASH:=0c00d4e5c97c8306e5fb932b348b34269c9c29a0e7df0e8e82958b407092bc19
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING
@@ -44,7 +44,7 @@ define Package/dnsmasq/Default
CATEGORY:=Base system
TITLE:=DNS and DHCP server
URL:=http://www.thekelleys.org.uk/dnsmasq/
- DEPENDS:=+libubus
+ DEPENDS:=+libubus +@BUSYBOX_CONFIG_PIDOF
USERID:=dnsmasq=453:dnsmasq=453
endef
diff --git a/package/network/services/dnsmasq/patches/001-CVE-2026-2291.patch b/package/network/services/dnsmasq/patches/001-CVE-2026-2291.patch
deleted file mode 100644
index a83fff1e1a..0000000000
--- a/package/network/services/dnsmasq/patches/001-CVE-2026-2291.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-commit ec2fbfbbdaa7d7db1c707dce26ce1a37cfe09660
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Fri Apr 10 16:29:31 2026 +0100
-
- Fix buffer overflow in struct bigname. CVE-2026-2291
-
- All buffers capable of holding a domain name should be
- at least MAXDNAME*2 + 1 bytes long, where MAXDNAME is the maximum
- size of a domain name. The accounts for the trailing zero and the
- fact that some characters are escaped in the internal representation
- of a domain name in dnsmasq.
-
- The declaration of struct bigname get this wrong, with the effect
- that a remote attacker capable of asking DNS queries or answering DNS
- queries can cause a large OOB write in the heap.
-
- This was first spotted by Andrew S. Fasano.
-
---- a/src/dnsmasq.h
-+++ b/src/dnsmasq.h
-@@ -471,7 +471,7 @@ struct interface_name {
- };
-
- union bigname {
-- char name[MAXDNAME];
-+ char name[(2*MAXDNAME) + 1];
- union bigname *next; /* freelist */
- };
-
diff --git a/package/network/services/dnsmasq/patches/002-CVE-2026-4890.dnsmasq-2.91.patch b/package/network/services/dnsmasq/patches/002-CVE-2026-4890.dnsmasq-2.91.patch
deleted file mode 100644
index bf126cd927..0000000000
--- a/package/network/services/dnsmasq/patches/002-CVE-2026-4890.dnsmasq-2.91.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-commit de76f21e115c451cf0653790fc4b209cd4778a07
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Fri Apr 10 22:16:45 2026 +0100
-
- Fix NSEC bitmap parsing infinite loop. CVE-2026-4890
-
- Report from Royce M <royce@xchglabs.com>.
-
- Location: dnssec.c:1290-1306, dnssec.c:1450-1463
-
- The bitmap window iteration advances by p[1] instead of p[1]+2 (missing the 2-byte window header). With bitmap_length=0, both rdlen and p are
- unchanged, causing an infinite loop and dnsmasq stops responding to all queries.
-
- The same code accesses p[2] after only checking rdlen >= 2 without verifying p[1] >= 1, causing OOB reads at 6 locations.
-
- Both bugs are reachable before RRSIG validation (confirmed by the source comment at line 2125), so no valid DNSSEC signatures are needed.
-
---- a/src/dnssec.c
-+++ b/src/dnssec.c
-@@ -1274,10 +1274,10 @@ static int prove_non_existence_nsec(stru
- packet checked to be as long as rdlen implies in prove_non_existence() */
-
- /* If we can prove that there's no NS record, return that information. */
-- if (nons && rdlen >= 2 && p[0] == 0 && (p[2] & (0x80 >> T_NS)) != 0)
-+ if (nons && rdlen >= 2 && p[0] == 0 && p[1] >= 1 && (p[2] & (0x80 >> T_NS)) != 0)
- *nons = 0;
-
-- if (rdlen >= 2 && p[0] == 0)
-+ if (rdlen >= 2 && p[0] == 0 && p[1] >= 1)
- {
- /* A CNAME answer would also be valid, so if there's a CNAME is should
- have been returned. */
-@@ -1305,8 +1305,8 @@ static int prove_non_existence_nsec(stru
- break; /* finished checking */
- }
-
-- rdlen -= p[1];
-- p += p[1];
-+ rdlen -= p[1] + 2;
-+ p += p[1] + 2;
- }
-
- return 0;
-@@ -1433,7 +1433,7 @@ static int check_nsec3_coverage(struct d
- p += hash_len; /* skip next-domain hash */
- rdlen -= p - psave;
-
-- if (rdlen >= 2 && p[0] == 0)
-+ if (rdlen >= 2 && p[0] == 0 && p[1] >= 1)
- {
- /* If we can prove that there's no NS record, return that information. */
- if (nons && (p[2] & (0x80 >> T_NS)) != 0)
-@@ -1462,8 +1462,8 @@ static int check_nsec3_coverage(struct d
- break; /* finished checking */
- }
-
-- rdlen -= p[1];
-- p += p[1];
-+ rdlen -= p[1] + 2;
-+ p += p[1] + 2;
- }
-
- return 1;
diff --git a/package/network/services/dnsmasq/patches/003-CVE-2026-4891.patch b/package/network/services/dnsmasq/patches/003-CVE-2026-4891.patch
deleted file mode 100644
index a4fdc36b0d..0000000000
--- a/package/network/services/dnsmasq/patches/003-CVE-2026-4891.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-commit 2cacea42e4d45717bd0ce3ccfe8e78960245e5da
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Wed Mar 25 23:04:08 2026 +0000
-
- Verify rdlen field in RRSIG packets. CVE-2026-4891
-
- Bug report from Royce M <royce@xchglabs.com>
-
- This avoids crafted packets which give a value for rdlen _less_
- then the space taken up by the fixed data and the signer's name
- and engender a negative calculated length for the signature.
-
---- a/src/dnssec.c
-+++ b/src/dnssec.c
-@@ -546,10 +546,14 @@ static int validate_rrset(time_t now, st
-
- *ttl_out = ttl;
- }
--
-+
-+ /* Don't trust rdlen not to be too small and give us a negative sig_len
-+ It has already been checked that it doesn't run us off the end
-+ of the packet. */
-+ if ((sig_len = rdlen - (p - psav)) <= 0)
-+ return STAT_BOGUS;
-+
- sig = p;
-- sig_len = rdlen - (p - psav);
--
- nsigttl = htonl(orig_ttl);
-
- hash->update(ctx, 18, psav);
diff --git a/package/network/services/dnsmasq/patches/004-CVE-2026-4892.patch b/package/network/services/dnsmasq/patches/004-CVE-2026-4892.patch
deleted file mode 100644
index 0867522a21..0000000000
--- a/package/network/services/dnsmasq/patches/004-CVE-2026-4892.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-commit 011a36c51438c986535a7248ed2e7f424f8e1078
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Wed Mar 25 23:16:35 2026 +0000
-
- Fix buffer overflow in helper.c with large CLIDs. CVE-2026-4892
-
- Bug reported bt Royce M <royce@xchglabs.com>
-
- Location: helper.c:265-270
- DHCPv6 CLIDs can be up to 65535 bytes. When --dhcp-script is configured,
- the helper hex-encodes raw CLID bytes via sprintf("%.2x") into daemon->packet (5131 bytes).
- A 1000-byte CLID writes ~3000 bytes. The helper process retains root privileges.
-
- Note: log6_packet() correctly caps CLID to 100 bytes for logging, but the helper code path was missed.
-
---- a/src/helper.c
-+++ b/src/helper.c
-@@ -261,8 +261,8 @@ int create_helper(int event_fd, int err_
- data.hostname_len + data.ed_len + data.clid_len, RW_READ))
- continue;
-
-- /* CLID into packet */
-- for (p = daemon->packet, i = 0; i < data.clid_len; i++)
-+ /* CLID into packet: limit to 100 bytes to avoid overflowing buffer. */
-+ for (p = daemon->packet, i = 0; i < data.clid_len && i < 100; i++)
- {
- p += sprintf(p, "%.2x", buf[i]);
- if (i != data.clid_len - 1)
diff --git a/package/network/services/dnsmasq/patches/005-CVE-2026-4893.patch b/package/network/services/dnsmasq/patches/005-CVE-2026-4893.patch
deleted file mode 100644
index fbfab76a01..0000000000
--- a/package/network/services/dnsmasq/patches/005-CVE-2026-4893.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-commit 434d68f2eb1a58744470698483a3ae09b5a9a870
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Wed Mar 25 23:22:37 2026 +0000
-
- Fix broken client subnet validation. CVE-2026-4893
-
- Bug report from Royce M <royce@xchglabs.com>
-
- Location: forward.c:713, edns0.c:421
-
- With --add-subnet enabled, process_reply() passes the OPT record
- length (~23 bytes) instead of the packet length to check_source().
- All internal bounds checks fail, and the function always returns 1.
- ECS source validation per RFC 7871 Section 9.2 is completely bypassed.
-
---- a/src/forward.c
-+++ b/src/forward.c
-@@ -722,7 +722,7 @@ static size_t process_reply(struct dns_h
- /* Get extended RCODE. */
- rcode |= sizep[2] << 4;
-
-- if (option_bool(OPT_CLIENT_SUBNET) && !check_source(header, plen, pheader, query_source))
-+ if (option_bool(OPT_CLIENT_SUBNET) && !check_source(header, n, pheader, query_source))
- {
- my_syslog(LOG_WARNING, _("discarding DNS reply: subnet option mismatch"));
- return 0;
diff --git a/package/network/services/dnsmasq/patches/006-CVE-2026-5172.patch b/package/network/services/dnsmasq/patches/006-CVE-2026-5172.patch
deleted file mode 100644
index 848e7fe854..0000000000
--- a/package/network/services/dnsmasq/patches/006-CVE-2026-5172.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-commit fa3c8ddef6712b52f562813317e6a997e1210123
-Author: Simon Kelley <simon@thekelleys.org.uk>
-Date: Mon Mar 30 16:24:33 2026 +0100
-
- Fix buffer overflow vulnerability in extract_addresses() CVE-2026-5172
-
- Thanks to Hugo Martinez Ray for spotting this.
-
- The value of rdlen for an RR can be a lie, allowing the
- call to extract_name() at rfc1025.c:952 to advance the value of p1
- past the calculated end of the record. The makes the calculation
- of bytes remaining in the RR underflow to a huge number and results
- in a massive heap OOB read and certain crash.
-
---- a/src/rfc1035.c
-+++ b/src/rfc1035.c
-@@ -985,7 +985,8 @@ int extract_addresses(struct dns_header
- /* Name, extract it then re-encode. */
- int len;
-
-- if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0))
-+ /* rdlen may lie, and extract_name() advances p1 past where it says the record ends. */
-+ if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0) || (p1 > endrr))
- {
- blockdata_free(addr.rrblock.rrdata);
- return 2;
diff --git a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch
index acfe740dfc..c2213439db 100644
--- a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch
+++ b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch
@@ -13,7 +13,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
-@@ -107,10 +107,6 @@ int main (int argc, char **argv)
+@@ -114,10 +114,6 @@ int main (int argc, char **argv)
read_opts(argc, argv, compile_opts);
@@ -26,7 +26,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
-@@ -1281,7 +1281,7 @@ extern struct daemon {
+@@ -1310,7 +1310,7 @@ extern struct daemon {
int inotifyfd;
#endif
#if defined(HAVE_LINUX_NETWORK)
@@ -35,7 +35,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
#elif defined(HAVE_BSD_NETWORK)
int dhcp_raw_fd, dhcp_icmp_fd, routefd;
#endif
-@@ -1494,9 +1494,6 @@ int read_write(int fd, unsigned char *pa
+@@ -1544,9 +1544,6 @@ int read_writev(int fd, struct iovec *io
void close_fds(long max_fd, int spare1, int spare2, int spare3);
int wildcard_match(const char* wildcard, const char* match);
int wildcard_matchn(const char* wildcard, const char* match, int num);
@@ -140,11 +140,10 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
my_syslog(LOG_ERR, _("failed to update ipset %s: %s"), setname, strerror(errno));
--- a/src/util.c
+++ b/src/util.c
-@@ -901,22 +901,3 @@ int wildcard_matchn(const char* wildcard
-
+@@ -928,25 +928,6 @@ int wildcard_matchn(const char* wildcard
return (!num) || (*wildcard == *match);
}
--
+
-#ifdef HAVE_LINUX_NETWORK
-int kernel_version(void)
-{
@@ -163,3 +162,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
- return version * 256 + (split ? atoi(split) : 0);
-}
-#endif
+-
+ #define hash_ptr(x) (((uintptr_t)(x)) & 0xffffff)
+
+ void *whine_malloc_real(const char *func, unsigned int line, size_t size)
diff --git a/package/network/services/dnsmasq/patches/200-ubus_dns.patch b/package/network/services/dnsmasq/patches/200-ubus_dns.patch
index a34ac4979f..5abc641cae 100644
--- a/package/network/services/dnsmasq/patches/200-ubus_dns.patch
+++ b/package/network/services/dnsmasq/patches/200-ubus_dns.patch
@@ -1,6 +1,6 @@
--- a/src/dnsmasq.c
+++ b/src/dnsmasq.c
-@@ -2097,6 +2097,10 @@ static void do_tcp_connection(struct lis
+@@ -2184,6 +2184,10 @@ static void do_tcp_connection(struct lis
daemon->pipe_to_parent = pipefd[1];
}
@@ -13,7 +13,7 @@
Reset that here. */
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
-@@ -1690,14 +1690,26 @@ void emit_dbus_signal(int action, struct
+@@ -1747,14 +1747,26 @@ void emit_dbus_signal(int action, struct
/* ubus.c */
#ifdef HAVE_UBUS
@@ -42,7 +42,7 @@
/* ipset.c */
--- a/src/forward.c
+++ b/src/forward.c
-@@ -801,7 +801,7 @@ static size_t process_reply(struct dns_h
+@@ -803,7 +803,7 @@ static size_t process_reply(struct dns_h
cache_secure = 0;
}
@@ -50,7 +50,7 @@
+ if ((daemon->doctors || ubus_dns_notify_has_subscribers()) && do_doctor(header, n, daemon->namebuff))
cache_secure = 0;
- /* check_for_bogus_wildcard() does it's own caching, so
+ /* check_for_bogus_wildcard() does its own caching, so
--- a/src/rfc1035.c
+++ b/src/rfc1035.c
@@ -13,8 +13,10 @@
@@ -65,7 +65,7 @@
/* EXTR_NAME_EXTRACT -> extract name
EXTR_NAME_COMPARE -> compare name, case insensitive
-@@ -437,10 +439,65 @@ static int private_net6(struct in6_addr
+@@ -452,10 +454,65 @@ int private_net6(struct in6_addr *a, int
((u32 *)a)[0] == htonl(0x20010db8); /* RFC 6303 4.6 */
}
@@ -132,7 +132,7 @@
int done = 0;
if (!(p = skip_questions(header, qlen)))
-@@ -457,7 +514,7 @@ int do_doctor(struct dns_header *header,
+@@ -472,7 +529,7 @@ int do_doctor(struct dns_header *header,
GETSHORT(qtype, p);
GETSHORT(qclass, p);
@@ -141,7 +141,7 @@
GETSHORT(rdlen, p);
if (qclass == C_IN && qtype == T_A)
-@@ -468,6 +525,9 @@ int do_doctor(struct dns_header *header,
+@@ -483,6 +540,9 @@ int do_doctor(struct dns_header *header,
if (!CHECK_LEN(header, p, qlen, INADDRSZ))
return done;
@@ -151,7 +151,7 @@
/* alignment */
memcpy(&addr.addr4, p, INADDRSZ);
-@@ -497,6 +557,14 @@ int do_doctor(struct dns_header *header,
+@@ -512,6 +572,14 @@ int do_doctor(struct dns_header *header,
break;
}
}
@@ -222,7 +222,7 @@
static int ubus_handle_metrics(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
struct blob_attr *msg)
-@@ -328,6 +354,53 @@ fail:
+@@ -333,6 +359,53 @@ fail:
} \
} while (0)