]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
protocol->import_control() could potentially call rte_cow() as well.
authorMartin Mares <mj@ucw.cz>
Wed, 13 Aug 2003 20:04:39 +0000 (20:04 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 13 Aug 2003 20:04:39 +0000 (20:04 +0000)
AFAIK it doesn't happen in any of our protocol, but better be sure.

nest/rt-table.c

index 7d8894d1cdb40efc3e6caaa31e52d47d163caa6c..06236b6425facec5be63c28fbed55f37a5fe516f 100644 (file)
@@ -168,22 +168,19 @@ do_rte_announce(struct announce_hook *a, net *net, rte *new, rte *old, ea_list *
 
   if (new)
     {
+      char *drop_reason = NULL;
       if ((class & IADDR_SCOPE_MASK) < p->min_scope)
-       {
-         rte_trace_out(D_FILTERS, p, new, "out of scope");
-         new = NULL;
-       }
+       drop_reason = "out of scope";
       else if ((ok = p->import_control ? p->import_control(p, &new, &tmpa, rte_update_pool) : 0) < 0)
-       {
-         rte_trace_out(D_FILTERS, p, new, "rejected by protocol");
-         new = NULL;
-       }
+       drop_reason = "rejected by protocol";
       else if (ok)
        rte_trace_out(D_FILTERS, p, new, "forced accept by protocol");
       else if (p->out_filter == FILTER_REJECT ||
               p->out_filter && f_run(p->out_filter, &new, &tmpa, rte_update_pool, FF_FORCE_TMPATTR) > F_ACCEPT)
+       drop_reason = "filtered out";
+      if (drop_reason)
        {
-         rte_trace_out(D_FILTERS, p, new, "filtered out");
+         rte_trace_out(D_FILTERS, p, new, drop_reason);
          if (new != new0)
            rte_free(new);
          new = NULL;
@@ -198,7 +195,11 @@ do_rte_announce(struct announce_hook *a, net *net, rte *new, rte *old, ea_list *
          ea_list *tmpb = p->make_tmp_attrs ? p->make_tmp_attrs(old, rte_update_pool) : NULL;
          ok = p->import_control ? p->import_control(p, &old, &tmpb, rte_update_pool) : 0;
          if (ok < 0 || (!ok && f_run(p->out_filter, &old, &tmpb, rte_update_pool, FF_FORCE_TMPATTR) > F_ACCEPT))
-           old = NULL;
+           {
+             if (old != old0)
+               rte_free(old);
+             old = NULL;
+           }
        }
     }
   if (p->debug & D_ROUTES)