summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorSergey Matveychuk <sem@FreeBSD.org>2007-11-12 20:53:30 +0000
committerSergey Matveychuk <sem@FreeBSD.org>2007-11-12 20:53:30 +0000
commit88a19bc60d66af848a2276d127e6779ed9a37fcb (patch)
treea8d32eb93687622684bb708b1e4cbc7d07a58d68 /net
parentdinoex@ has choosen to apply a vendor patch that has resolved CVE-2007-4351 (diff)
- A vendor patch. It fixes a bug#418 - changing address on an existing
interface doesn't cause static routes to be revalidated. Approved by: portmgr (erwin), maintainer
Notes
Notes: svn path=/head/; revision=202647
Diffstat (limited to 'net')
-rw-r--r--net/quagga/Makefile2
-rw-r--r--net/quagga/files/patch-cvs-10-connroutechange175
2 files changed, 176 insertions, 1 deletions
diff --git a/net/quagga/Makefile b/net/quagga/Makefile
index 458910b7e795..3723b2917034 100644
--- a/net/quagga/Makefile
+++ b/net/quagga/Makefile
@@ -7,7 +7,7 @@
PORTNAME= quagga
PORTVERSION= 0.99.9
-PORTREVISION= 4
+PORTREVISION= 5
CATEGORIES= net ipv6
MASTER_SITES= http://quagga.net/download/ \
http://www.ru.quagga.net/download/ \
diff --git a/net/quagga/files/patch-cvs-10-connroutechange b/net/quagga/files/patch-cvs-10-connroutechange
new file mode 100644
index 000000000000..d2cdfa6d7dc3
--- /dev/null
+++ b/net/quagga/files/patch-cvs-10-connroutechange
@@ -0,0 +1,175 @@
+--- lib/linklist.c 15 Jun 2006 12:43:09 -0000 1.11
++++ lib/linklist.c 12 Nov 2007 14:41:09 -0000
+@@ -158,6 +158,7 @@ listnode_add_after (struct list *list, s
+
+ pp->next = nn;
+ }
++ list->count++;
+ }
+
+
+--- lib/workqueue.c 30 Mar 2006 14:45:47 -0000 1.8
++++ lib/workqueue.c 12 Nov 2007 14:41:09 -0000
+@@ -66,6 +66,8 @@ work_queue_new (struct thread_master *m,
+
+ new->name = XSTRDUP (MTYPE_WORK_QUEUE_NAME, queue_name);
+ new->master = m;
++ SET_FLAG (new->flags, WQ_UNPLUGGED);
++ UNSET_FLAG (new->flags, WQ_AIM_HEAD);
+
+ if ( (new->items = list_new ()) == NULL)
+ {
+@@ -103,7 +105,7 @@ static inline int
+ work_queue_schedule (struct work_queue *wq, unsigned int delay)
+ {
+ /* if appropriate, schedule work queue thread */
+- if ( (wq->flags == WQ_UNPLUGGED)
++ if ( CHECK_FLAG (wq->flags, WQ_UNPLUGGED)
+ && (wq->thread == NULL)
+ && (listcount (wq->items) > 0) )
+ {
+@@ -129,7 +131,10 @@ work_queue_add (struct work_queue *wq, v
+ }
+
+ item->data = data;
+- listnode_add (wq->items, item);
++ if (CHECK_FLAG (wq->flags, WQ_AIM_HEAD))
++ listnode_add_after (wq->items, NULL, item);
++ else
++ listnode_add (wq->items, item);
+
+ work_queue_schedule (wq, wq->spec.hold);
+
+@@ -186,7 +191,7 @@ DEFUN(show_work_queues,
+ for (ALL_LIST_ELEMENTS_RO ((&work_queues), node, wq))
+ {
+ vty_out (vty,"%c %8d %5d %8ld %7d %6d %6u %s%s",
+- (wq->flags == WQ_PLUGGED ? 'P' : ' '),
++ (CHECK_FLAG (wq->flags, WQ_UNPLUGGED) ? ' ' : 'P'),
+ listcount (wq->items),
+ wq->spec.hold,
+ wq->runs,
+@@ -211,7 +216,7 @@ work_queue_plug (struct work_queue *wq)
+
+ wq->thread = NULL;
+
+- wq->flags = WQ_PLUGGED;
++ UNSET_FLAG (wq->flags, WQ_UNPLUGGED);
+ }
+
+ /* unplug queue, schedule it again, if appropriate
+@@ -220,12 +225,21 @@ work_queue_plug (struct work_queue *wq)
+ void
+ work_queue_unplug (struct work_queue *wq)
+ {
+- wq->flags = WQ_UNPLUGGED;
++ SET_FLAG (wq->flags, WQ_UNPLUGGED);
+
+ /* if thread isnt already waiting, add one */
+ work_queue_schedule (wq, wq->spec.hold);
+ }
+
++void
++work_queue_aim_head (struct work_queue *wq, const unsigned aim_head)
++{
++ if (aim_head)
++ SET_FLAG (wq->flags, WQ_AIM_HEAD);
++ else
++ UNSET_FLAG (wq->flags, WQ_AIM_HEAD);
++}
++
+ /* timer thread to process a work queue
+ * will reschedule itself if required,
+ * otherwise work_queue_item_add
+--- lib/workqueue.h 30 Mar 2006 14:25:24 -0000 1.8
++++ lib/workqueue.h 12 Nov 2007 14:41:09 -0000
+@@ -47,11 +47,8 @@ struct work_queue_item
+ unsigned short ran; /* # of times item has been run */
+ };
+
+-enum work_queue_flags
+-{
+- WQ_UNPLUGGED = 0,
+- WQ_PLUGGED = 1,
+-};
++#define WQ_UNPLUGGED (1 << 0) /* available for draining */
++#define WQ_AIM_HEAD (1 << 1) /* add new items before list head, not after tail */
+
+ struct work_queue
+ {
+@@ -101,7 +98,7 @@ struct work_queue
+ } cycles; /* cycle counts */
+
+ /* private state */
+- enum work_queue_flags flags; /* user set flag */
++ u_int16_t flags; /* user set flag */
+ };
+
+ /* User API */
+@@ -122,6 +119,8 @@ extern void work_queue_add (struct work_
+ extern void work_queue_plug (struct work_queue *wq);
+ /* unplug the queue, allow it to be drained again */
+ extern void work_queue_unplug (struct work_queue *wq);
++/* control the value for WQ_AIM_HEAD flag */
++extern void work_queue_aim_head (struct work_queue *wq, const unsigned);
+
+ /* Helpers, exported for thread.c and command.c */
+ extern int work_queue_run (struct thread *);
+--- zebra/connected.c 2 May 2007 16:05:35 -0000 1.28
++++ zebra/connected.c 12 Nov 2007 14:41:10 -0000
+@@ -35,6 +35,7 @@
+ #include "zebra/redistribute.h"
+ #include "zebra/interface.h"
+ #include "zebra/connected.h"
++extern struct zebra_t zebrad;
+
+ /* withdraw a connected address */
+ static void
+@@ -187,8 +188,15 @@ connected_up_ipv4 (struct interface *ifp
+ if (prefix_ipv4_any (&p))
+ return;
+
++ /* Always push arriving/departing connected routes into the head of
++ * the working queue to make possible proper validation of the rest
++ * of the RIB queue (which will contain the whole RIB after the first
++ * call to rib_update()).
++ */
++ work_queue_aim_head (zebrad.ribq, 1);
+ rib_add_ipv4 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, NULL, ifp->ifindex,
+ RT_TABLE_MAIN, ifp->metric, 0);
++ work_queue_aim_head (zebrad.ribq, 0);
+
+ rib_update ();
+ }
+@@ -293,7 +301,10 @@ connected_down_ipv4 (struct interface *i
+ if (prefix_ipv4_any (&p))
+ return;
+
++ /* Same logic as for connected_up_ipv4(): push the changes into the head. */
++ work_queue_aim_head (zebrad.ribq, 1);
+ rib_delete_ipv4 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0);
++ work_queue_aim_head (zebrad.ribq, 0);
+
+ rib_update ();
+ }
+@@ -338,8 +349,10 @@ connected_up_ipv6 (struct interface *ifp
+ return;
+ #endif
+
++ work_queue_aim_head (zebrad.ribq, 1);
+ rib_add_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0,
+ ifp->metric, 0);
++ work_queue_aim_head (zebrad.ribq, 0);
+
+ rib_update ();
+ }
+@@ -413,7 +426,9 @@ connected_down_ipv6 (struct interface *i
+ if (IN6_IS_ADDR_UNSPECIFIED (&p.prefix))
+ return;
+
++ work_queue_aim_head (zebrad.ribq, 1);
+ rib_delete_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0);
++ work_queue_aim_head (zebrad.ribq, 0);
+
+ rib_update ();
+ }