[Dnsmasq-discuss] dnsmasq DHCP server crash on latest FreshTomato router firmware

Tijs Van Buggenhout tijs.van.buggenhout at axsguard.com
Thu Mar 13 13:52:45 UTC 2025


Hi Simon,

This is a regression. When dnsmasq is started without upstreams (yet), but a 
DNS query comes in that needs forwarding dnsmasq now potentially crashes as 
the value for "first" variable is undetermined.

A segmentation violation occurs when the index is out of bounds of 
serverarray.

(gdb) run -d --log-queries --log-debug -R
Starting program: /var/tmp/git/dnsmasq/src/dnsmasq -d --log-queries --log-
debug -R
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
dnsmasq: started, version 2.91rc5-2-ge427d4b cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt no-DBus no-UBus no-i18n no-IDN 
DHCP DHCPv6 no-Lua TFTP no-conntrack ipset no-nftset auth no-DNSSEC loop-
detect inotify dumpfile
dnsmasq: warning: no upstream servers configured
dnsmasq: read /etc/hosts - 42 names
dnsmasq: *** log_query_mysockaddr: IN
dnsmasq: query[A] freshtomato.org from 127.0.0.1
dnsmasq: *** forward_query: IN
dnsmasq: *** forward_query: new query
dnsmasq: *** forward_query: if (!lookup_domain())
dnsmasq: *** forward_query: before master =
dnsmasq: *** forward_query: first=[-8080]

Program received signal SIGSEGV, Segmentation fault.
0x0000555555578c83 in forward_query (udpfd=udpfd at entry=4, 
udpaddr=udpaddr at entry=0x7fffffffe180, dst_addr=dst_addr at entry=0x7fffffffe160, 
dst_iface=dst_iface at entry=1, header=header at entry=0x5555555be2f0, 
plen=plen at entry=56, replylimit=1232, now=1741871839, forward=0x0, 
fwd_flags=160, fast_retry=0) at forward.c:398
398           master = daemon->serverarray[first];
(gdb) bt
#0  0x0000555555578c83 in forward_query (udpfd=udpfd at entry=4, 
udpaddr=udpaddr at entry=0x7fffffffe180, dst_addr=dst_addr at entry=0x7fffffffe160, 
dst_iface=dst_iface at entry=1, header=header at entry=0x5555555be2f0, 
plen=plen at entry=56, 
    replylimit=1232, now=1741871839, forward=0x0, fwd_flags=160, fast_retry=0) 
at forward.c:398
#1  0x0000555555579c27 in receive_query (listen=<optimized out>, 
now=now at entry=1741871839) at forward.c:2053
#2  0x000055555557e184 in check_dns_listeners (now=now at entry=1741871839) at 
dnsmasq.c:1912
#3  0x000055555555dfc0 in main (argc=<optimized out>, argv=<optimized out>) at 
dnsmasq.c:1289
(gdb) quit

Please consider the following patch...

Credits go to pedro0311 <pedro at freshtomato.org>

>From 0d87b0ac8ed525ab1eb43b753145702eba0db197 Mon Sep 17 00:00:00 2001
From: Tijs Van Buggenhout <tijs.van.buggenhout at axsguard.com>
Date: Thu, 13 Mar 2025 14:42:10 +0100
Subject: [PATCH] Partially revert "Always save  forwarded query locally."

This partially reverts commit 3b6df06fb8cb3652d2e7afd085fae3f416408013.
---
 src/forward.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/forward.c b/src/forward.c
index 8207a7e..939a4dc 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -353,9 +353,7 @@ static void forward_query(int udpfd, union mysockaddr 
*udpaddr,
 	  ede = EDE_NOT_READY;
 	  flags = 0;
 	}
-
-      master = daemon->serverarray[first];
-
+       
       /* don't forward A or AAAA queries for simple names, except the empty 
name */
       if (!flags &&
 	  option_bool(OPT_NODOTS_LOCAL) &&
@@ -368,6 +366,8 @@ static void forward_query(int udpfd, union mysockaddr 
*udpaddr,
       if (flags || ede == EDE_NOT_READY)
 	goto reply;
       
+      master = daemon->serverarray[first];
+      
       if (!(forward = get_new_frec(now, master, 0)))
 	goto reply;
       /* table full - flags == 0, return REFUSED */
-- 
2.37.4

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/attachments/20250313/3af17c5a/attachment.sig>


More information about the Dnsmasq-discuss mailing list