components/quagga/patches/55-bgpd-rm-assert.patch
changeset 641 719d637aca9f
parent 640 4afec94b6313
child 642 817474c3c772
--- a/components/quagga/patches/55-bgpd-rm-assert.patch	Tue Jan 03 09:16:46 2012 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-commit 9eda90ce8094683a5315007fbd0f9249a284f36f
-Author: Paul Jakma <[email protected]>
-Date:   Thu Aug 30 13:36:17 2007 +0000
-
-    [bgpd] bug #398 Bogus free on out route-map, and assert() with rsclients
-    
-    2007-08-27 Paul Jakma <[email protected]>
-    
-    	* bgp_route.c: (bgp_announce_check) Fix bug #398, slight
-    	  modification of Vladimir Ivanov's suggested fix - to keep
-    	  memory alloc conditional.
-    	  (bgp_process_announce_selected) Don't take struct attr as
-    	  argument, none of the callers need it and it needlessly
-    	  distances allocation from use.
-    	  Free the extended attr, the attr itself is on the stack.
-    	  Fix bad indentation.
-    	* bgp_attr.c: (bgp_packet_attribute) Remove incorrect assert,
-    	  and adjust conditional to test attr->extra, diagnosis by
-    	  Vladimir Ivanov in bug #398.
-    
-    2007-08-27 Vladimir Ivanov <[email protected]>
-    
-    	* bgp_route.c: (bgp_announce_check_rsclient) copy of
-    	  ri->attr is no longer deep enough, due to addition of
-    	  attr->extra. It should use bgp_attr_dup, as
-    	  bgp_announce_check() does.
-
-diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
-index 23d9586..ee17b6d 100644
---- bgpd/bgp_attr.c
-+++ bgpd/bgp_attr.c
-@@ -1625,8 +1625,6 @@
-       && from
-       && peer_sort (from) == BGP_PEER_IBGP)
-     {
--      assert (attr->extra);
--      
-       /* Originator ID. */
-       stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
-       stream_putc (s, BGP_ATTR_ORIGINATOR_ID);
-@@ -1641,7 +1639,7 @@
-       stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
-       stream_putc (s, BGP_ATTR_CLUSTER_LIST);
-       
--      if (attr->extra->cluster)
-+      if (attr->extra && attr->extra->cluster)
- 	{
- 	  stream_putc (s, attr->extra->cluster->length + 4);
- 	  /* If this peer configuration's parent BGP has cluster_id. */
-diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
-index 0f4da98..9ddeca5 100644
---- bgpd/bgp_route.c
-+++ bgpd/bgp_route.c
-@@ -999,11 +999,10 @@
-       || (ri->extra && ri->extra->suppress) )
-     {
-       struct bgp_info info;
--      struct attr dummy_attr;
-+      struct attr dummy_attr = { 0 };
-       
-       info.peer = peer;
-       info.attr = attr;
--      
- 
-       /* The route reflector is not allowed to modify the attributes
- 	 of the reflected IBGP routes. */
-@@ -1010,9 +1009,8 @@
-       if (peer_sort (from) == BGP_PEER_IBGP 
- 	  && peer_sort (peer) == BGP_PEER_IBGP)
- 	{
--	  dummy_attr.extra = NULL;
- 	  bgp_attr_dup (&dummy_attr, attr);
--	  info.attr = &dummy_attr; 
-+	  info.attr = &dummy_attr;
- 	}
- 
-       SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT); 
-@@ -1024,7 +1022,8 @@
- 
-       peer->rmap_type = 0;
-       
--      bgp_attr_extra_free (&dummy_attr);
-+      if (dummy_attr.extra)
-+        bgp_attr_extra_free (&dummy_attr);
-       
-       if (ret == RMAP_DENYMATCH)
- 	{
-@@ -1127,7 +1126,7 @@
- #endif /* BGP_SEND_ASPATH_CHECK */
- 
-   /* For modify attribute, copy it to temporary structure. */
--  *attr = *ri->attr;
-+  bgp_attr_dup (attr, ri->attr);
- 
-   /* next-hop-set */
-   if ((p->family == AF_INET && attr->nexthop.s_addr == 0)
-@@ -1329,21 +1328,22 @@
- 
- static int
- bgp_process_announce_selected (struct peer *peer, struct bgp_info *selected,
--        struct bgp_node *rn, struct attr *attr, afi_t afi, safi_t safi)
--    {
-+                               struct bgp_node *rn, afi_t afi, safi_t safi)
-+{
-   struct prefix *p;
-+  struct attr attr = { 0 };
- 
-   p = &rn->p;
- 
--      /* Announce route to Established peer. */
--      if (peer->status != Established)
-+  /* Announce route to Established peer. */
-+  if (peer->status != Established)
-     return 0;
- 
--      /* Address family configuration check. */
--      if (! peer->afc_nego[afi][safi])
-+  /* Address family configuration check. */
-+  if (! peer->afc_nego[afi][safi])
-     return 0;
- 
--      /* First update is deferred until ORF or ROUTE-REFRESH is received */
-+  /* First update is deferred until ORF or ROUTE-REFRESH is received */
-   if (CHECK_FLAG (peer->af_sflags[afi][safi],
-       PEER_STATUS_ORF_WAIT_REFRESH))
-     return 0;
-@@ -1353,8 +1353,8 @@
-       case BGP_TABLE_MAIN:
-       /* Announcement to peer->conf.  If the route is filtered,
-          withdraw it. */
--        if (selected && bgp_announce_check (selected, peer, p, attr, afi, safi))
--          bgp_adj_out_set (rn, peer, p, attr, afi, safi, selected);
-+        if (selected && bgp_announce_check (selected, peer, p, &attr, afi, safi))
-+          bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
-         else
-           bgp_adj_out_unset (rn, peer, p, afi, safi);
-         break;
-@@ -1361,13 +1361,16 @@
-       case BGP_TABLE_RSCLIENT:
-         /* Announcement to peer->conf.  If the route is filtered, 
-            withdraw it. */
--        if (selected && bgp_announce_check_rsclient
--              (selected, peer, p, attr, afi, safi))
--          bgp_adj_out_set (rn, peer, p, attr, afi, safi, selected);
--      else
--	bgp_adj_out_unset (rn, peer, p, afi, safi);
-+        if (selected && 
-+            bgp_announce_check_rsclient (selected, peer, p, &attr, afi, safi))
-+          bgp_adj_out_set (rn, peer, p, &attr, afi, safi, selected);
-+        else
-+	  bgp_adj_out_unset (rn, peer, p, afi, safi);
-         break;
-     }
-+  
-+  bgp_attr_extra_free (&attr);
-+  
-   return 0;
- }
- 
-@@ -1417,8 +1420,7 @@
- 	      bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
- 	    }
- 
--	  bgp_process_announce_selected (rsclient, new_select, rn, &attr,
--					 afi, safi);
-+	  bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
- 	}
-     }
-   else
-@@ -1430,8 +1432,7 @@
- 	  bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
- 	  bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
- 	}
--      bgp_process_announce_selected (rsclient, new_select, rn,
--				     &attr, afi, safi);
-+      bgp_process_announce_selected (rsclient, new_select, rn, afi, safi);
-     }
- 
-   if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
-@@ -1457,10 +1458,7 @@
-   struct bgp_info_pair old_and_new;
-   struct listnode *node, *nnode;
-   struct peer *peer;
--  struct attr attr;
-   
--  memset (&attr, 0, sizeof (struct attr));
--  
-   /* Best path selection. */
-   bgp_best_selection (bgp, rn, &old_and_new);
-   old_select = old_and_new.old;
-@@ -1491,7 +1489,7 @@
-   /* Check each BGP peer. */
-   for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
-     {
--      bgp_process_announce_selected (peer, new_select, rn, &attr, afi, safi);
-+      bgp_process_announce_selected (peer, new_select, rn, afi, safi);
-     }
- 
-   /* FIB update. */
-@@ -1516,8 +1514,6 @@
-   if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
-     bgp_info_reap (rn, old_select);
-   
--  bgp_attr_extra_free (&attr);
--  
-   UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
-   return WQ_SUCCESS;
- }
-@@ -5888,7 +5884,7 @@
- 	      {
- 		struct route_map *rmap = output_arg;
- 		struct bgp_info binfo;
--		struct attr dummy_attr; 
-+		struct attr dummy_attr = { 0 }; 
- 		int ret;
- 
- 		bgp_attr_dup (&dummy_attr, ri->attr);