diff options
author | Christian Franke <chris@opensourcerouting.org> | 2013-01-28 07:14:43 +0100 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2013-02-01 17:55:04 +0100 |
commit | d53d8fda42e1ce43852d3b4cff914ce79b5c6785 (patch) | |
tree | 65fabd06d7388d593c1260c18558acd29c82b523 | |
parent | aeef13b0d5b50a90f293c93eb5a34c2a099d140b (diff) |
bgpd: fix crash in soft-reconfiguration
Commit 8692c50652 introduced a bug where bgpd would crash on
soft-reconfiguration.
This happens e.g. when there are filtered unicast routes because
rn->info is NULL in that case, which the code did not account for.
Reported-by: Paweł Staszewski <pstaszewski@itcare.pl>
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r-- | bgpd/bgp_route.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 8bc72d7b..fb35fab8 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2643,10 +2643,10 @@ bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi, for (ain = rn->adj_in; ain; ain = ain->next) { struct bgp_info *ri = rn->info; + u_char *tag = (ri && ri->extra) ? ri->extra->tag : NULL; bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer, - &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd, - (bgp_info_extra_get (ri))->tag); + &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd, tag); } } @@ -2690,10 +2690,11 @@ bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi, if (ain->peer == peer) { struct bgp_info *ri = rn->info; + u_char *tag = (ri && ri->extra) ? ri->extra->tag : NULL; ret = bgp_update (peer, &rn->p, ain->attr, afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, - prd, (bgp_info_extra_get (ri))->tag, 1); + prd, tag, 1); if (ret < 0) { |