]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
if: Add if_freeifaddrs so we can free ifaddrs on all code paths
authorRoy Marples <roy@marples.name>
Fri, 23 Dec 2022 13:54:22 +0000 (13:54 +0000)
committerRoy Marples <roy@marples.name>
Fri, 23 Dec 2022 13:56:39 +0000 (13:56 +0000)
Fixes #157.

src/dhcpcd.c
src/if.c
src/if.h

index ccfb98946464323605f6a05edd9cc0dff5760757..29ae486b02c6f2d8b12dbdb00cbeb419057b1b5f 100644 (file)
@@ -1105,6 +1105,7 @@ out:
                if_free(ifp);
        }
        free(ifs);
+       if_freeifaddrs(&ifaddrs);
 
        return e;
 }
@@ -1244,6 +1245,7 @@ dhcpcd_linkoverflow(struct dhcpcd_ctx *ctx)
        if_markaddrsstale(ctx->ifaces);
        if_learnaddrs(ctx, ctx->ifaces, &ifaddrs);
        if_deletestaleaddrs(ctx->ifaces);
+       if_freeifaddrs(&ifaddrs);
 }
 
 void
@@ -2539,6 +2541,8 @@ start_manager:
                        dhcpcd_initstate1(ifp, argc, argv, 0);
        }
        if_learnaddrs(&ctx, ctx.ifaces, &ifaddrs);
+       if_freeifaddrs(&ifaddrs);
+       ifaddrs = NULL;
 
        if (ctx.options & DHCPCD_BACKGROUND)
                dhcpcd_daemonise(&ctx);
index b00f5e6f384ba95d6a25c1577a4182e2707f5ca5..862fc73eb72fafce800470faab9507ac1d63a42a 100644 (file)
--- a/src/if.c
+++ b/src/if.c
@@ -356,6 +356,13 @@ if_learnaddrs(struct dhcpcd_ctx *ctx, struct if_head *ifs,
 #endif
                }
        }
+}
+
+void if_freeifaddrs(struct ifaddrs **ifaddrs)
+{
+
+       if (ifaddrs == NULL)
+               return;
 
 #ifdef PRIVSEP_GETIFADDRS
        if (IN_PRIVSEP(ctx))
@@ -363,7 +370,6 @@ if_learnaddrs(struct dhcpcd_ctx *ctx, struct if_head *ifs,
        else
 #endif
                freeifaddrs(*ifaddrs);
-       *ifaddrs = NULL;
 }
 
 void
index ac5c5721a9e2172b31820d2ebcad6d52abdb2fec..5d11015d743f4f345cabbb9df3a266e17c878fe3 100644 (file)
--- a/src/if.h
+++ b/src/if.h
@@ -170,6 +170,7 @@ bool if_is_link_up(const struct interface *);
 bool if_valid_hwaddr(const uint8_t *, size_t);
 struct if_head *if_discover(struct dhcpcd_ctx *, struct ifaddrs **,
     int, char * const *);
+void if_freeifaddrs(struct ifaddrs **);
 void if_markaddrsstale(struct if_head *);
 void if_learnaddrs(struct dhcpcd_ctx *, struct if_head *, struct ifaddrs **);
 void if_deletestaleaddrs(struct if_head *);