]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix routing generation when we receive a host route over CSR.
authorRoy Marples <roy@marples.name>
Wed, 15 Apr 2015 21:09:40 +0000 (21:09 +0000)
committerRoy Marples <roy@marples.name>
Wed, 15 Apr 2015 21:09:40 +0000 (21:09 +0000)
ipv4.c

diff --git a/ipv4.c b/ipv4.c
index 2e43f0286ae0a444d4d881fda5e65b686e59700d..3b1bedc7f3e7c2015ead14d83ec5dbff7210fafb 100644 (file)
--- 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;
 }