From 34620e24b5d8fcb0d66f77dfb39bcd8da636564a Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 1 Dec 2016 09:11:12 -0500 Subject: [PATCH] bgpd: Fix crashes when no default bgp instance is configured. The vnc code assumes that bgp must have a default instance. This code change checks to make sure that we do before proceeding. It makes no assurances that vnc will behave correctly without a default instance. Signed-off-by: Donald Sharp Signed-off-by: David Lamparter --- bgpd/rfapi/rfapi_import.c | 3 ++- bgpd/rfapi/vnc_import_bgp.c | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c index 8783024f16..77da4f9eed 100644 --- a/bgpd/rfapi/rfapi_import.c +++ b/bgpd/rfapi/rfapi_import.c @@ -4414,7 +4414,8 @@ rfapiProcessPeerDown (struct peer *peer) */ bgp = bgp_get_default (); /* assume 1 instance for now */ - assert (bgp); + if (!bgp) + return; h = bgp->rfapi; assert (h); diff --git a/bgpd/rfapi/vnc_import_bgp.c b/bgpd/rfapi/vnc_import_bgp.c index 4215ce2bf7..dc2640ab9e 100644 --- a/bgpd/rfapi/vnc_import_bgp.c +++ b/bgpd/rfapi/vnc_import_bgp.c @@ -208,12 +208,17 @@ prefix_bag_free (void *pb) static void print_rhn_list (const char *tag1, const char *tag2) { - struct bgp *bgp = bgp_get_default (); - struct skiplist *sl = bgp->rfapi->resolve_nve_nexthop; + struct bgp *bgp; + struct skiplist *sl; struct skiplistnode *p; struct prefix_bag *pb; int count = 0; + bgp = bgp_get_default (); + if (!bgp) + return; + + sl = bgp->frapi->resolve_nve_nexthop; if (!sl) { zlog_debug ("%s: %s: RHN List is empty", (tag1 ? tag1 : ""), @@ -251,6 +256,8 @@ vnc_rhnck (char *tag) struct skiplistnode *p; bgp = bgp_get_default (); + if (!bgp) + return; sl = bgp->rfapi->resolve_nve_nexthop; if (!sl) @@ -1798,6 +1805,9 @@ vnc_import_bgp_exterior_add_route_it ( struct bgp *bgp_default = bgp_get_default (); afi_t afi = family2afi (prefix->family); + if (!bgp_default) + return; + h = bgp_default->rfapi; hc = bgp_default->rfapi_cfg; @@ -1992,6 +2002,9 @@ vnc_import_bgp_exterior_del_route ( afi_t afi = family2afi (prefix->family); struct bgp *bgp_default = bgp_get_default (); + if (!bgp_default) + return; + memset (&pfx_orig_nexthop, 0, sizeof (struct prefix)); /* keep valgrind happy */ h = bgp_default->rfapi;