From: Ondrej Zajicek (work) Date: Mon, 28 Jan 2019 14:23:54 +0000 (+0100) Subject: BGP: Cleanup channels when going down X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccee5a863e9280ca2bebe81e559891e1953cc129;p=thirdparty%2Fbird.git BGP: Cleanup channels when going down When going up, uncleaned old channel state may trigger unexpected conditions crashing bird. --- diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 0e60d88d8..9eb24bec9 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -1576,6 +1576,11 @@ bgp_channel_cleanup(struct channel *C) if (c->igp_table_ip6) rt_unlock_table(c->igp_table_ip6); + + c->index = 0; + + /* Cleanup rest of bgp_channel starting at pool field */ + memset(&(c->pool), 0, sizeof(struct bgp_channel) - OFFSETOF(struct bgp_channel, pool)); } static inline struct bgp_channel_config * diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 3a1efc8cc..27d9350a2 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -282,12 +282,16 @@ struct bgp_channel { /* Rest are BGP specific data */ struct bgp_channel_config *cf; - pool *pool; /* XXXX */ u32 afi; u32 index; const struct bgp_af_desc *desc; + rtable *igp_table_ip4; /* Table for recursive IPv4 next hop lookups */ + rtable *igp_table_ip6; /* Table for recursive IPv6 next hop lookups */ + + /* Rest are zeroed when down */ + pool *pool; HASH(struct bgp_bucket) bucket_hash; /* Hash table of route buckets */ struct bgp_bucket *withdraw_bucket; /* Withdrawn routes */ list bucket_queue; /* Queue of buckets to send (struct bgp_bucket) */ @@ -295,8 +299,6 @@ struct bgp_channel { HASH(struct bgp_prefix) prefix_hash; /* Prefixes to be sent */ slab *prefix_slab; /* Slab holding prefix nodes */ - rtable *igp_table_ip4; /* Table for recursive IPv4 next hop lookups */ - rtable *igp_table_ip6; /* Table for recursive IPv6 next hop lookups */ ip_addr next_hop_addr; /* Local address for NEXT_HOP attribute */ ip_addr link_addr; /* Link-local version of next_hop_addr */