Download raw body.
dhcp6leased frontend memory leak
On Thu, Jun 19, 2025 at 08:08:39AM +1000, Jonathan Matthew wrote:
> While looking at memory usage on my home router, I noticed the dhcp6leased
> frontend process had grown to around 170MB in the couple of months it had
> been running.
>
> After restarting with malloc leak checking and letting it run for a while,
> the malloc dump reported that a number of allocations from getifaddrs()
> hadn't been freed.
>
> update_iface() calls getifaddrs() and then returns early without calling
> freeifaddrs() in some conditions, one of which I'm hitting - it gets
> called for lo1, which isn't in the frontend's interface list.
> Not sure what that means. My config is just
> 'request prefix delegation on dwqe0 for { lo1 vport0 vport1 }'.
>
> Anyway, update_iface() doesn't look at the interface list until after
> those checks are done, so we can just move the getifaddrs call down.
> I've been running with this diff for a bit and the steady growth of
> the frontend process (8-12 kB every 5 minutes) is no longer happening.
>
> ok?
OK bluhm@
> Index: frontend.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhcp6leased/frontend.c,v
> diff -u -p -u -p -r1.21 frontend.c
> --- frontend.c 27 Apr 2025 16:22:33 -0000 1.21
> +++ frontend.c 18 Jun 2025 10:39:52 -0000
> @@ -559,9 +559,6 @@ update_iface(uint32_t if_index)
> int flags;
> char ifnamebuf[IF_NAMESIZE], *if_name;
>
> - if (getifaddrs(&ifap) != 0)
> - fatal("getifaddrs");
> -
> if ((if_name = if_indextoname(if_index, ifnamebuf)) == NULL)
> return;
>
> @@ -570,6 +567,9 @@ update_iface(uint32_t if_index)
>
> if (find_iface_conf(&frontend_conf->iface_list, if_name) == NULL)
> return;
> +
> + if (getifaddrs(&ifap) != 0)
> + fatal("getifaddrs");
>
> memset(&ifinfo, 0, sizeof(ifinfo));
> ifinfo.if_index = if_index;
dhcp6leased frontend memory leak