Mercurial > hg > dhcpcd
changeset 4570:6baf24a8cc49 draft
dhcpcd: Don't leak memory when routing socket overflows
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Tue, 23 Jul 2019 14:53:01 +0100 |
| parents | 5de548eda5ae |
| children | 727f73f1ffab |
| files | src/dhcpcd.c |
| diffstat | 1 files changed, 8 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/dhcpcd.c Tue Jul 23 14:33:14 2019 +0100 +++ b/src/dhcpcd.c Tue Jul 23 14:53:01 2019 +0100 @@ -1135,6 +1135,10 @@ /* Work out the current interfaces. */ ifaces = if_discover(ctx, &ifaddrs, ctx->ifc, ctx->ifv); + if (ifaces == NULL) { + logerr(__func__); + return; + } /* Punt departed interfaces */ TAILQ_FOREACH_SAFE(ifp, ctx->ifaces, next, ifn) { @@ -1144,21 +1148,23 @@ } /* Add new interfaces */ - TAILQ_FOREACH_SAFE(ifp, ifaces, next, ifn) { + while ((ifp = TAILQ_FIRST(ifaces)) != NULL ) { + TAILQ_REMOVE(ifaces, ifp, next); ifp1 = if_find(ctx->ifaces, ifp->name); if (ifp1 != NULL) { /* If the interface already exists, * check carrier state. */ eloop_timeout_add_sec(ctx->eloop, 0, dhcpcd_checkcarrier, ifp1); + if_free(ifp); continue; } - TAILQ_REMOVE(ifaces, ifp, next); TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next); if (ifp->active) eloop_timeout_add_sec(ctx->eloop, 0, dhcpcd_prestartinterface, ifp); } + free(ifaces); /* Update address state. */ if_markaddrsstale(ctx->ifaces);
