]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
RIP: Fix crash when interface is removed
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 14 Feb 2020 21:37:07 +0000 (22:37 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 14 Feb 2020 21:43:27 +0000 (22:43 +0100)
Recent changes in neighbor code caused RIP to access neighbor field which
is NULL during interface/neighbor removal and caused crash when debug
messages are enabled. Use correct field to get iface from neighbor.

proto/rip/rip.c

index 4559310ebb0ff6b0db342677e1b508080c9d9125..e811a3d84329d4e6a81ddbafd11ca4f6ace40625 100644 (file)
@@ -167,7 +167,7 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
        struct nexthop *nh = allocz(sizeof(struct nexthop));
 
        nh->gw = rt->next_hop;
-       nh->iface = rt->from->nbr->iface;
+       nh->iface = rt->from->ifa->iface;
        nh->weight = rt->from->ifa->cf->ecmp_weight;
 
        nexthop_insert(&nhs, nh);
@@ -184,7 +184,7 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
       /* Unipath route */
       a0.from = rt->from->nbr->addr;
       a0.nh.gw = rt->next_hop;
-      a0.nh.iface = rt->from->nbr->iface;
+      a0.nh.iface = rt->from->ifa->iface;
     }
 
     rta *a = rta_lookup(&a0);
@@ -402,7 +402,7 @@ rip_remove_neighbor(struct rip_proto *p, struct rip_neighbor *n)
 {
   neighbor *nbr = n->nbr;
 
-  TRACE(D_EVENTS, "Removing neighbor %I on %s", nbr->addr, nbr->iface->name);
+  TRACE(D_EVENTS, "Removing neighbor %I on %s", nbr->addr, nbr->ifreq->name);
 
   rem_node(NODE n);
   n->ifa = NULL;