]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: fix the "no neighbor A.B.C.D maximum-prefix" command
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 19 Oct 2018 18:54:05 +0000 (15:54 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Sat, 20 Oct 2018 15:39:05 +0000 (12:39 -0300)
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 <renato@opensourcerouting.org>
bgpd/bgpd.c

index 9272eae95fbfcce4fd6e74c86435fea96bc295a5..e82f9e1b0d27be4427261def469f35a64a57060c 100644 (file)
@@ -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;