From 13b75bacf7221eb655dcbed54e3c3605bea5169e Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 13 Aug 2003 20:04:39 +0000 Subject: [PATCH] protocol->import_control() could potentially call rte_cow() as well. AFAIK it doesn't happen in any of our protocol, but better be sure. --- nest/rt-table.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/nest/rt-table.c b/nest/rt-table.c index 7d8894d1..06236b64 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -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)