From: Roy Marples Date: Wed, 15 Apr 2015 21:09:40 +0000 (+0000) Subject: Fix routing generation when we receive a host route over CSR. X-Git-Tag: v6.8.2~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ad1bfb2ba2ca510d96b6f13300eeaaacb77827b;p=thirdparty%2Fdhcpcd.git Fix routing generation when we receive a host route over CSR. --- diff --git a/ipv4.c b/ipv4.c index 2e43f028..3b1bedc7 100644 --- a/ipv4.c +++ b/ipv4.c @@ -440,38 +440,30 @@ d_route(struct rt *rt) return retval; } -static struct rt * -make_subnet_route(const struct interface *ifp) +static struct rt_head * +add_subnet_route(struct rt_head *rt, const struct interface *ifp) { const struct dhcp_state *s; struct rt *r; + if (rt == NULL) /* earlier malloc failed */ + return NULL; + s = D_CSTATE(ifp); + /* Don't create a subnet route for these addresses */ if (s->net.s_addr == INADDR_BROADCAST || s->net.s_addr == INADDR_ANY) - return NULL; + return rt; - r = malloc(sizeof(*r)); - if (r == NULL) { + if ((r = malloc(sizeof(*r))) == NULL) { logger(ifp->ctx, 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 = INADDR_ANY; - return r; -} -static struct rt_head * -add_subnet_route(struct rt_head *rt, const struct interface *ifp) -{ - struct rt *r; - - if (rt == NULL) /* earlier malloc failed */ - return NULL; - - if ((r = make_subnet_route(ifp)) == NULL) - return NULL; TAILQ_INSERT_HEAD(rt, r, next); return rt; }