Patch applied. The problem is clear and the fix is good.
https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commit;h=d16b995756dc079b1fdc2e63665793979f766a26
Thanks for your contribution.
Cheers,
Simon.
On 28/09/2023 09:28, renmingshuai via Dnsmasq-discuss wrote:
When I repeatedly reloaded the dnsmasq process, I found a memory leak.
To reproduce the problem, perform the following steps:
(1)Run dnsmasq as follows:
# dnsmasq --no-hosts --no-resolv --dhcp-optsfile=/tmp/opts
--dhcp-range=set:subnet-368e344f-8862-46f5-897e-02602d2e0eaa,2003:0:0:1499::,static,64,2h
# cat /tmp/opts
tag:subnet-368e344f-8862-46f5-897e-02602d2e0eaa,option6:domain-search,openstacklocal
tag:subnet-368e344f-8862-46f5-897e-02602d2e0eaa,option6:dns-server,[2003:0:0:1499::2],[2003:0:0:1499::3]
(2) Send SIGHUP to dnsmasq repeatedly
# cat send.sh
#!/bin/bash
while true
do
kill -HUP `pidof dnsmasq`
sleep
done
# sh send.sh
After a period of time, the vmRss value of the dnsmasq process keeps
increasing.
# date
Fri Sep 29 12:43:27 AM CST 2023
[root@localhost home]# ps -aux|grep dnsmasq
dnsmasq 3322571 0.0 0.0 9044 2456 ? S 00:43 0:00
dnsmasq --no-hosts --no-resolv --dhcp-optsfile=/tmp/opts
--dhcp-range=set:subnet-368e344f-8862-46f5-897e-02602d2e0eaa,2003:0:0:1499::,static,64,infinite
# date
Fri Sep 29 01:09:28 AM CST 2023
# ps -aux|grep dnsmasq
dnsmasq 3322571 0.1 0.0 9772 3280 ? S 00:43 0:02
dnsmasq --no-hosts --no-resolv --dhcp-optsfile=/tmp/opts
--dhcp-range=set:subnet-368e344f-8862-46f5-897e-02602d2e0eaa,2003:0:0:1499::,static,64,infinite
When we configure DHCPv6 option information by using –dhcp-optsfile,
dnsmasq process allocates memory to store those information. However,
when dnsmasq receives SIGHUP and reread the –dhcp-optsfile, it does not
release the memory that store DHCPv6 options information as it does for
DHCPv4 options.
The following patch could fix this problem.
---
src/option.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/option.c b/src/option.c
index 8322725..1cf2796 100644
--- a/src/option.c
+++ b/src/option.c
@@ -5734,11 +5734,11 @@ static void clear_dynamic_conf(void)
}
}
-static void clear_dynamic_opt(void)
+static void clear_dhcp_opt(struct dhcp_opt **dhcp_opts)
{
struct dhcp_opt *opts, *cp, **up;
- for (up = &daemon->dhcp_opts, opts = daemon->dhcp_opts; opts; opts = cp)
+ for (up = dhcp_opts, opts = *dhcp_opts; opts; opts = cp)
{
cp = opts->next;
@@ -5752,6 +5752,14 @@ static void clear_dynamic_opt(void)
}
}
+static void clear_dynamic_opt(void)
+{
+ clear_dhcp_opt(&daemon->dhcp_opts);
+#ifdef HAVE_DHCP6
+ clear_dhcp_opt(&daemon->dhcp_opts6);
+#endif
+}
+
void reread_dhcp(void)
{
struct hostsfile *hf;
--
2.33.0
_______________________________________________
Dnsmasq-discuss mailing list
[email protected]
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss
_______________________________________________
Dnsmasq-discuss mailing list
[email protected]
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss