]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Nest: Fix corner case in recursive next hop lookup
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 29 Jan 2018 11:49:37 +0000 (12:49 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 29 Jan 2018 11:49:37 +0000 (12:49 +0100)
Thanks to Svenne Krap for the bugreport.

nest/rt-table.c

index 4640d6a99a517b1e00f2ed707a572736f27e85fd..6ee261e80cecaee6cc94f4c32899466ca11d79f2 100644 (file)
@@ -2392,12 +2392,13 @@ static int
 rt_update_hostentry(rtable *tab, struct hostentry *he)
 {
   rta *old_src = he->src;
+  int direct = 0;
   int pxlen = 0;
 
   /* Reset the hostentry */
   he->src = NULL;
-  he->nexthop_linkable = 0;
   he->dest = RTD_UNREACHABLE;
+  he->nexthop_linkable = 0;
   he->igp_metric = 0;
 
   net_addr he_addr;
@@ -2417,9 +2418,7 @@ rt_update_hostentry(rtable *tab, struct hostentry *he)
          goto done;
        }
 
-      he->dest = a->dest;
-      he->nexthop_linkable = 1;
-      if (he->dest == RTD_UNICAST)
+      if (a->dest == RTD_UNICAST)
        {
          for (struct nexthop *nh = &(a->nh); nh; nh = nh->next)
            if (ipa_zero(nh->gw))
@@ -2432,12 +2431,13 @@ rt_update_hostentry(rtable *tab, struct hostentry *he)
                    goto done;
                  }
 
-               he->nexthop_linkable = 0;
-               break;
+               direct++;
              }
        }
 
       he->src = rta_clone(a);
+      he->dest = a->dest;
+      he->nexthop_linkable = !direct;
       he->igp_metric = rt_get_igp_metric(e);
     }