Hi,
have you tried whether the most recent master commit PLUS the patch
submitted by Erik Karlsson on April 29 fixes the issue as well?
See
https://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2024q2/017561.html
Concerning your observation about not crashing after adding a print
statement: This is pretty common when you are compiling any project with
optimizations enabled as printing variable contents prevents a few
optimizations from happening causing the actual machine code realization
to be quite different. Rather often this is sufficient to prevent
certain bugs from showing up.
Best,
Dominik
On 28.07.24 10:19, renmingshuai via Dnsmasq-discuss wrote:
Hi,
I have a problem with a Segmentation fault. The log is as follows:
024-07-24T17:06:00.540592+08:00 info kernel[-][25317.980044]
dnsmasq[597243]: segfault at 9 ip 000015257897bObe sp 00007fffba533380
error 4 in libc.so.6 15257890c000+1710001
This Segmentation fault is triggered when dnsmasq clears dynamic
config in the reload phase. The coredump is as follows:
[New LWP 2925451]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
Core was generated by `dnsmasq --no-hosts --no-resolv
--pid-file=/var/lib/neutron/dhcp/d7435322-bf42-4'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000151e5168b0be in free () from /usr/lib64/libc.so.6
(gdb) bt
#0 0x0000151e5168b0be in free () from /usr/lib64/libc.so.6
#1 0x00005651025a08f0 in dhcp_netid_free (nid=0xc08b255501ae7f00) at
option.c:1022
#2 dhcp_netid_list_free (netid=0x0) at option.c:1053
#3 dhcp_config_free (config=0x565104124bc0) at option.c:1071
#4 0x00005651025aa011 in clear_dynamic_conf () at option.c:5204
#5 reread_dhcp () at option.c:5245
#6 0x00005651025b2c53 in clear_cache_and_reload (now=1722067132) at
dnsmasq.c:1699
#7 0x00005651025960ac in async_event (now=1722067132, pipe=15) at
dnsmasq.c:1449
#8 main (argc=<optimized out>, argv=<optimized out>) at dnsmasq.c:1192
(gdb)
I also reproduced the issue on the latest dnsmasq.
I created multiple namespaces and ran dnsmasq in each namespace. The
dnsmasq run parameters are as follows: (The path varies according to
the dnsmasq process parameter.)
dnsmasq --no-hosts --no-resolv
--pid-file=/var/lib/neutron/dhcp/d7435322-bf42-48a6-b95d-015e2953ff5f/pid
--dhcp-hostsfile=/var/lib/neutron/dhcp/d7435322-bf42-48a6-b95d-015e2953ff5f/host
--addn-hosts=/var/lib/neutron/dhcp/d7435322-bf42-48a6-b95d-015e2953ff5f/addn_hosts
--dhcp-optsfile=/var/lib/neutron/dhcp/d7435322-bf42-48a6-b95d-015e2953ff5f/opts
--dhcp-leasefile=/var/lib/neutron/dhcp/d7435322-bf42-48a6-b95d-015e2953ff5f/leases
--dhcp-match=set:ipxe,175 --dhcp-userclass=set:ipxe6,iPXE
--local-service --bind-dynamic --enable-ra
--ra-param=tap75e693e7-82,0,0
--dhcp-range=set:subnet-bcf0c6db-49ad-42e4-9651-a98c1d7ede7e,fc52:152:42:100::,ra-stateless,64,infinite
--dhcp-lease-max=16777216 --conf-file=/etc/neutron/dnsmasq.conf
--domain=openstacklocal
The issue does not reproduce the issue before the committe 10d8b5f001,
and it does not reproduce the issue when I rollback 10d8b5f001 in the
latest version.
Commit 10d8b5f001 removes duplicate code and replaces free
(list->list) with dhcp_netid_free(tmplist->list).
Before:
clear_dynamic_conf
for (list = configs->netid; list; list = tmplist)
{
free(list->list);
tmplist = list->next;
free(list);
}
NOW:
clear_dynamic_conf
dhcp_config_free
dhcp_netid_list_free
while (netid)
{
struct dhcp_netid_list *tmplist = netid;
netid = netid->next;
dhcp_netid_free(tmplist->list);
free(tmplist);
}
Recurrence operation:
The following method may be used to reproduce the problem.
Keep adding new stuff to the optsfile and reload dnsmasq. This problem
recurs when about 300 contents are added.
However, this problem does not recur on each host.
There is another strange phenomenon. When I add logs as follow, the
problem cannot be reproduced:
diff --git a/src/option.c b/src/option.c
index f4ff7c0..958b761 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1329,6 +1329,7 @@ static void dhcp_netid_free(struct dhcp_netid *nid)
{
struct dhcp_netid *tmp = nid;
nid = nid->next;
+ my_syslog(MS_DHCP | LOG_INFO, "=====tmp->net=%p\n", tmp->net);
free(tmp->net);
free(tmp);
}
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss