Add some more memory cleanups when testing forking.
writepid(pidfd, pid);
close(pidfd);
pidfd = -1;
+ options |= DHCPCD_FORKED;
exit(EXIT_SUCCESS);
}
options |= DHCPCD_DAEMONISED;
#define DHCPCD_IPV6RA_OWN (1ULL << 33)
#define DHCPCD_IPV6RA_OWN_DEFAULT (1ULL << 34)
#define DHCPCD_IPV4 (1ULL << 35)
+#define DHCPCD_FORKED (1ULL << 36)
extern const struct option cf_options[];
static void
ipv6_cleanup()
{
+ struct rt6 *rt;
+ while ((rt = TAILQ_FIRST(routes))) {
+ TAILQ_REMOVE(routes, rt, next);
+ free(rt);
+ }
free(routes);
}
#endif
}
static void
-ipv6rs_drop_addrs(struct ra *rap)
+ipv6rs_freedrop_addrs(struct ra *rap, int drop)
{
struct ipv6_addr *ap;
while ((ap = TAILQ_FIRST(&rap->addrs))) {
TAILQ_REMOVE(&rap->addrs, ap, next);
- if ((options & DHCPCD_IPV6RA_OWN)) {
- syslog(LOG_INFO, "%s: deleting address %s",
+ if (drop && (options & DHCPCD_IPV6RA_OWN)) {
+ syslog(LOG_INFO, "%s: deleting address %s",
rap->iface->name, ap->saddr);
if (del_address6(rap->iface, ap) == -1)
syslog(LOG_ERR, "del_address6 %m");
}
}
-void ipv6rs_drop_ra(struct ra *rap)
+void ipv6rs_freedrop_ra(struct ra *rap, int drop)
{
delete_timeout(NULL, rap->iface);
delete_timeout(NULL, rap);
TAILQ_REMOVE(&ipv6_routers, rap, next);
- ipv6rs_drop_addrs(rap);
+ ipv6rs_freedrop_addrs(rap, drop);
ipv6rs_free_opts(rap);
free(rap->data);
free(rap->ns);
n = 0;
TAILQ_FOREACH_SAFE(rap, &ipv6_routers, next, ran) {
if (rap->iface == ifp) {
- ipv6rs_drop_ra(rap);
+ ipv6rs_free_ra(rap);
n++;
}
}
void ipv6rs_handledata(void *);
int ipv6rs_start(struct interface *);
ssize_t ipv6rs_env(char **, const char *, const struct interface *);
-void ipv6rs_drop_ra(struct ra *);
+void ipv6rs_freedrop_ra(struct ra *, int);
+#define ipv6rs_free_ra(ra) ipv6rs_freedrop_ra((ra), 0)
+#define ipv6rs_drop_ra(ra) ipv6rs_freedrop_ra((ra), 1)
ssize_t ipv6rs_free(struct interface *);
void ipv6rs_expire(void *arg);
int ipv6rs_has_ra(const struct interface *);
restore_kernel_ra(void)
{
+ if (!(options & DHCPCD_FORKED))
+ return;
syslog(LOG_INFO, "restoring Kernel IPv6 RA support");
if (set_inet6_sysctl(IPV6CTL_ACCEPT_RTADV, 1) == -1)
syslog(LOG_ERR, "IPV6CTL_ACCEPT_RTADV: %m");
{
char path[256];
+#ifndef DEBUG_MEMORY
+ if (options & DHCPCD_FORKED)
+ return;
+#endif
+
for (nrestore--; nrestore >= 0; nrestore--) {
+#ifdef DEBUG_MEMORY
+ if (!(options & DHCPCD_FORKED)) {
+#endif
syslog(LOG_INFO, "%s: restoring Kernel IPv6 RA support",
restore[nrestore]);
snprintf(path, sizeof(path), "%s/%s/accept_ra",
if (write_path(path, "1") == -1)
syslog(LOG_ERR, "write_path: %s: %m", path);
#ifdef DEBUG_MEMORY
+ }
free(restore[nrestore]);
#endif
}
if (r == 0)
options |= DHCPCD_IPV6RA_OWN;
else if (options & DHCPCD_IPV6RA_OWN) {
- syslog(LOG_INFO, "disabling Kernel IPv6 RA support");
+ syslog(LOG_INFO, "%s: disabling Kernel IPv6 RA support",
+ ifname);
if (write_path(path, "0") == -1) {
syslog(LOG_ERR, "write_path: %s: %m", path);
return 0;