From: Renato Westphal Date: Fri, 19 Oct 2018 18:54:05 +0000 (-0300) Subject: bgpd: fix the "no neighbor A.B.C.D maximum-prefix" command X-Git-Tag: frr-7.1-dev~253^2~10 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=6282637da16571ea90cfaf658fe092792f7841ed;p=mirror%2Ffrr.git bgpd: fix the "no neighbor A.B.C.D maximum-prefix" command The peer->group pointer is set only if the PEER_STATUS_GROUP flag is set in the peer. Add a protection to prevent a NULL pointer dereference. Signed-off-by: Renato Westphal --- diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 9272eae95f..e82f9e1b0d 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -6306,9 +6306,6 @@ int peer_maximum_prefix_set(struct peer *peer, afi_t afi, safi_t safi, int peer_maximum_prefix_unset(struct peer *peer, afi_t afi, safi_t safi) { - struct peer *member; - struct listnode *node, *nnode; - /* Inherit configuration from peer-group if peer is member. */ if (peer_group_active(peer)) { peer_af_flag_inherit(peer, afi, safi, PEER_FLAG_MAX_PREFIX); @@ -6332,19 +6329,26 @@ int peer_maximum_prefix_unset(struct peer *peer, afi_t afi, safi_t safi) * Remove flags and configuration from all peer-group members, unless * they are explicitely overriding peer-group configuration. */ - for (ALL_LIST_ELEMENTS(peer->group->peer, node, nnode, member)) { - /* Skip peers with overridden configuration. */ - if (CHECK_FLAG(member->af_flags_override[afi][safi], - PEER_FLAG_MAX_PREFIX)) - continue; + if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) { + struct peer *member; + struct listnode *node; - /* Remove flag and configuration on peer-group member. */ - UNSET_FLAG(member->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX); - UNSET_FLAG(member->af_flags[afi][safi], - PEER_FLAG_MAX_PREFIX_WARNING); - member->pmax[afi][safi] = 0; - member->pmax_threshold[afi][safi] = 0; - member->pmax_restart[afi][safi] = 0; + for (ALL_LIST_ELEMENTS_RO(peer->group->peer, node, member)) { + /* Skip peers with overridden configuration. */ + if (CHECK_FLAG(member->af_flags_override[afi][safi], + PEER_FLAG_MAX_PREFIX)) + continue; + + /* Remove flag and configuration on peer-group member. + */ + UNSET_FLAG(member->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX); + UNSET_FLAG(member->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_WARNING); + member->pmax[afi][safi] = 0; + member->pmax_threshold[afi][safi] = 0; + member->pmax_restart[afi][safi] = 0; + } } return 0;