From 38152a1141cdcb90e062c85a122fc37b8fad8308 Mon Sep 17 00:00:00 2001 From: Stephen Worley Date: Wed, 9 Oct 2019 19:35:46 -0400 Subject: [PATCH] lib: Don't add/del from name tree if name isnt set If the name has not been set yet (we were only passed the ifindex in some cases like with master/slave timings) then do not add/del it from the ifname rb tree on the vrf struct. Doing so causes duplicate entries on the tree and infinte loops can happen when iterating over it. Signed-off-by: Stephen Worley --- lib/if.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/if.c b/lib/if.c index c5d90c83ab..9c9252e111 100644 --- a/lib/if.c +++ b/lib/if.c @@ -186,7 +186,9 @@ void if_update_to_new_vrf(struct interface *ifp, vrf_id_t vrf_id) /* remove interface from old master vrf list */ old_vrf = vrf_lookup_by_id(ifp->vrf_id); if (old_vrf) { - IFNAME_RB_REMOVE(old_vrf, ifp); + if (ifp->name[0] != '\0') + IFNAME_RB_REMOVE(old_vrf, ifp); + if (ifp->ifindex != IFINDEX_INTERNAL) IFINDEX_RB_REMOVE(old_vrf, ifp); } @@ -194,7 +196,9 @@ void if_update_to_new_vrf(struct interface *ifp, vrf_id_t vrf_id) ifp->vrf_id = vrf_id; vrf = vrf_get(ifp->vrf_id, NULL); - IFNAME_RB_INSERT(vrf, ifp); + if (ifp->name[0] != '\0') + IFNAME_RB_INSERT(vrf, ifp); + if (ifp->ifindex != IFINDEX_INTERNAL) IFINDEX_RB_INSERT(vrf, ifp);