diff options
author | Chion Tang <sdspeedonion@gmail.com> | 2018-03-29 12:19:49 +0100 |
---|---|---|
committer | Chion Tang <sdspeedonion@gmail.com> | 2018-03-29 12:19:49 +0100 |
commit | d265dccfd349a35dc382c8027d1374892a76b0ff (patch) | |
tree | 2ecd68b39c87f55acbae6e0d788c6ccad197829b | |
parent | fix: multiple interface mapping leak (diff) | |
download | netfilter-full-cone-nat-d265dccfd349a35dc382c8027d1374892a76b0ff.tar.gz netfilter-full-cone-nat-d265dccfd349a35dc382c8027d1374892a76b0ff.tar.bz2 netfilter-full-cone-nat-d265dccfd349a35dc382c8027d1374892a76b0ff.zip |
fix: conntrack event notifier conflicts
-rw-r--r-- | xt_FULLCONENAT.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c index 22f1e0f..00ec5d6 100644 --- a/xt_FULLCONENAT.c +++ b/xt_FULLCONENAT.c @@ -72,6 +72,7 @@ struct nat_mapping { struct nf_ct_event_notifier ct_event_notifier; int tg_refer_count = 0; +int ct_event_notifier_registered = 0; static DEFINE_MUTEX(nf_ct_net_event_lock); @@ -551,9 +552,14 @@ static int fullconenat_tg_check(const struct xt_tgchk_param *par) if (tg_refer_count == 1) { nf_ct_netns_get(par->net, par->family); ct_event_notifier.fcn = ct_event_cb; - nf_conntrack_register_notifier(par->net, &ct_event_notifier); - pr_debug("xt_FULLCONENAT: fullconenat_tg_check(): ct_event_notifier registered\n"); + if (nf_conntrack_register_notifier(par->net, &ct_event_notifier) == 0) { + ct_event_notifier_registered = 1; + pr_debug("xt_FULLCONENAT: fullconenat_tg_check(): ct_event_notifier registered\n"); + } else { + printk("xt_FULLCONENAT: warning: failed to register a conntrack notifier. Disable active GC for mappings.\n"); + } + } mutex_unlock(&nf_ct_net_event_lock); @@ -570,10 +576,14 @@ static void fullconenat_tg_destroy(const struct xt_tgdtor_param *par) pr_debug("xt_FULLCONENAT: fullconenat_tg_destroy(): tg_refer_count is now %d\n", tg_refer_count); if (tg_refer_count == 0) { - nf_conntrack_unregister_notifier(par->net, &ct_event_notifier); - nf_ct_netns_put(par->net, par->family); + if (ct_event_notifier_registered) { + nf_conntrack_unregister_notifier(par->net, &ct_event_notifier); + ct_event_notifier_registered = 0; - pr_debug("xt_FULLCONENAT: fullconenat_tg_destroy(): ct_event_notifier unregistered\n"); + pr_debug("xt_FULLCONENAT: fullconenat_tg_destroy(): ct_event_notifier unregistered\n"); + + } + nf_ct_netns_put(par->net, par->family); } mutex_unlock(&nf_ct_net_event_lock); |