Nest: Fix corner case in recursive next hop lookup

Thanks to Svenne Krap for the bugreport.
This commit is contained in:
Ondrej Zajicek (work) 2018-01-29 12:49:37 +01:00
parent 345e50d59f
commit 85ad5855a0

View file

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