We noticed that the ntpd engine process was getting a bit big on some boxes
that we'd accidentally cut off from the ntp servers (routing is hard).
Reading through the code, I noticed the 'query' member of struct ntp_peer
is never freed, which seems to account for the leak.
If you have a server pool in ntpd.conf and it resolves, but ntpd is unable
to talk to the servers, it will re-resolve periodically, freeing the old list
of peers and creating new ones.
To show how slow the leak is, here's the leak report from MALLOC_OPTIONS=D
after running for about two hours with four servers from two pools.
without diff:
Leak report
f sum # avg
0x0 9392 128 73
0x889878b920b 512 1 512
0x889878bc8e1 4096 4 1024
0x889878bd065 128 2 64
0x88bc91f0b4b 18280 1 18280
0x88bc926a9ed 65536 1 65536
with diff:
Leak report
f sum # avg
0x0 6064 16 379
0xbee1253320b 512 1 512
0xbf0265f4b4b 18280 1 18280
0xbf02666e9ed 65536 1 65536
ok?
Index: ntp.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntp.c,v
retrieving revision 1.168
diff -u -p -r1.168 ntp.c
--- ntp.c 24 Oct 2021 21:24:19 -0000 1.168
+++ ntp.c 23 Mar 2022 10:43:59 -0000
@@ -686,6 +686,7 @@ void
peer_remove(struct ntp_peer *p)
{
TAILQ_REMOVE(&conf->ntp_peers, p, entry);
+ free(p->query);
free(p);
peer_cnt--;
}