]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Nest: Fix race condition during reconfiguration, part 2
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 6 Jul 2018 00:04:45 +0000 (02:04 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 6 Jul 2018 00:04:45 +0000 (02:04 +0200)
If export filter is changed during reconfiguration and a route disappears
between reconfiguration and refeed (e.g., if the route is a static route
also removed during the reconfiguration), the route is not withdrawn.

The issue was fixed for regular channels by an earlier patch. This patch
fixes the issue for channels in RA_ACCEPTED mode (first-pass-the-filter),
used by BGP with 'secondary' option.

nest/rt-table.c

index 9ce524289e70663e73b7cabfe4eb7b4333ed2b57..9dcbda0506dcb7119e6a99ebee7d1756821ec8ba 100644 (file)
@@ -678,8 +678,18 @@ rt_notify_accepted(struct channel *c, net *net, rte *new_changed, rte *old_chang
    *
    * - We found new_best the same as new_changed, therefore it cannot
    *   be old_best and we have to continue search for old_best.
+   *
+   * There is also a hack to ensure consistency in case of changed filters.
+   * It does not find the proper old_best, just selects a non-NULL route.
    */
 
+  /* Hack for changed filters */
+  if (old_changed && (old_changed->lastmod <= c->last_tx_filter_change))
+    {
+      old_best = old_changed;
+      goto found;
+    }
+
   /* First case */
   if (old_meet)
     if (old_best = export_filter(c, old_changed, &old_free, 1))