cidr = *p++;
if (cidr > 32) {
ipv4_freeroutes(routes);
- free(routes);
errno = EINVAL;
return NULL;
}
if (rt == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
ipv4_freeroutes(routes);
- free(routes);
return NULL;
}
TAILQ_INSERT_TAIL(routes, rt, next);
syslog(LOG_ERR, "%s: %m", __func__);
return NULL;
}
+ TAILQ_INIT(routes);
if (!has_option_mask(ifo->nomask, DHO_STATICROUTE))
p = get_option(dhcp, DHO_STATICROUTE, &len, NULL);
else
route = calloc(1, sizeof(*route));
if (route == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
- break;
+ ipv4_freeroutes(routes);
+ return NULL;
}
memcpy(&route->dest.s_addr, p, 4);
p += 4;
route = calloc(1, sizeof(*route));
if (route == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
- break;
+ ipv4_freeroutes(routes);
+ return NULL;
}
memcpy(&route->gate.s_addr, p, 4);
p += 4;
struct rt *r;
const struct dhcp_state *s;
+ if (rt == NULL) /* earlier malloc failed */
+ return NULL;
+
s = D_CSTATE(ifp);
if (s->net.s_addr == INADDR_BROADCAST ||
s->net.s_addr == INADDR_ANY ||
return rt;
r = malloc(sizeof(*r));
- if (r == NULL)
+ if (r == NULL) {
+ syslog(LOG_ERR, "%s: %m", __func__);
+ ipv4_freeroutes(rt);
return NULL;
+ }
r->dest.s_addr = s->addr.s_addr & s->net.s_addr;
r->net.s_addr = s->net.s_addr;
r->gate.s_addr = 0;
{
struct rt *r;
- TAILQ_FOREACH(r, rt, next) {
- if (r->gate.s_addr == D_CSTATE(ifp)->addr.s_addr &&
- r->net.s_addr == INADDR_BROADCAST)
- r->gate.s_addr = r->dest.s_addr;
+ if (rt) {
+ TAILQ_FOREACH(r, rt, next) {
+ if (r->gate.s_addr == D_CSTATE(ifp)->addr.s_addr &&
+ r->net.s_addr == INADDR_BROADCAST)
+ r->gate.s_addr = r->dest.s_addr;
+ }
}
return rt;
}
{
struct rt *r;
- if (!(iface->flags & IFF_POINTOPOINT) ||
+ if (rt == NULL || /* failed a malloc earlier probably */
+ !(iface->flags & IFF_POINTOPOINT) ||
!has_option_mask(iface->options->dstmask, DHO_ROUTER))
return rt;
+
r = malloc(sizeof(*r));
if (r == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
+ ipv4_freeroutes(rt);
return NULL;
}
r->dest.s_addr = INADDR_ANY;
struct rt *rtp, *rtn;
const char *cp, *cp2, *cp3, *cplim;
+ if (rt == NULL) /* earlier malloc failed */
+ return NULL;
+
TAILQ_FOREACH(rtp, rt, next) {
if (rtp->dest.s_addr != INADDR_ANY)
continue;
rtn = malloc(sizeof(*rtn));
if (rtn == NULL) {
syslog(LOG_ERR, "%s: %m", __func__);
- continue;
+ ipv4_freeroutes(rt);
+ return NULL;
}
rtn->dest.s_addr = rtp->gate.s_addr;
rtn->net.s_addr = INADDR_BROADCAST;
dnr = add_router_host_route(dnr, ifp);
dnr = add_destination_route(dnr, ifp);
}
+ if (dnr == NULL) /* failed to malloc all new routes */
+ continue;
TAILQ_FOREACH_SAFE(rt, dnr, next, rtn) {
rt->iface = ifp;
rt->metric = ifp->metric;