From: "Vitaly E. Lavrov" <lve@guap.ru>
To: netfilter-devel@vger.kernel.org
Subject: [PATCH] xt_recent fix BUG()
Date: Tue, 11 Dec 2012 23:06:32 +0400 [thread overview]
Message-ID: <50C78438.4040102@guap.ru> (raw)
[-- Attachment #1: Type: text/plain, Size: 2465 bytes --]
The following patch fixes a bug in xt_recent.
Bug appears at the end of work the networks namespace, provided that the
tables (filter/mangle/raw) have rule with xt_recent.
The error occurs because the __net_exit recent_net_exit() is executed
before the tables are cleared.
Change this order of calls is impossible, since tables must be
registered earlier than extensions.
Bug exists in all versions of the kernel since 2.6.35
Cleaning tables before completing the network namespace can be used as a
workaround.
Idea of the patch that if the files are deleted from the directory
/proc/net/xt_recent" procedure XXXXX, then a flag is set "clean".
If cleaning the tables occurs later and the flag "clean" is set, then
the delete files is skipped.
Patch for kernel 3.4.22
Signed-off-by: Vitaly Lavrov lve@guap.ru
--
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c
index d2ff15a..747d52d 100644
--- a/net/netfilter/xt_recent.c
+++ b/net/netfilter/xt_recent.c
@@ -85,6 +85,7 @@ struct recent_net {
struct list_head tables;
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *xt_recent;
+ int clean;
#endif
};
@@ -398,7 +399,8 @@ static void recent_mt_destroy(const struct
xt_mtdtor_param *par)
list_del(&t->list);
spin_unlock_bh(&recent_lock);
#ifdef CONFIG_PROC_FS
- remove_proc_entry(t->name, recent_net->xt_recent);
+ if(!recent_net->clean)
+ remove_proc_entry(t->name, recent_net->xt_recent);
#endif
recent_table_flush(t);
kfree(t);
@@ -599,15 +601,26 @@ static int __net_init recent_net_init(struct net *net)
{
struct recent_net *recent_net = recent_pernet(net);
+#ifdef CONFIG_PROC_FS
+ recent_net->clean = 0;
+#endif
INIT_LIST_HEAD(&recent_net->tables);
return recent_proc_net_init(net);
}
static void __net_exit recent_net_exit(struct net *net)
{
+#ifdef CONFIG_PROC_FS
struct recent_net *recent_net = recent_pernet(net);
+ struct recent_table *t;
- BUG_ON(!list_empty(&recent_net->tables));
+ spin_lock_bh(&recent_lock);
+ recent_net->clean = 1;
+ list_for_each_entry(t, &recent_net->tables, list) {
+ remove_proc_entry(t->name, recent_net->xt_recent);
+ }
+ }
+ spin_unlock_bh(&recent_lock);
+#endif
recent_proc_net_exit(net);
}
[-- Attachment #2: xt_recent.c.diff --]
[-- Type: text/plain, Size: 1382 bytes --]
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c
index d2ff15a..747d52d 100644
--- a/net/netfilter/xt_recent.c
+++ b/net/netfilter/xt_recent.c
@@ -85,6 +85,7 @@ struct recent_net {
struct list_head tables;
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *xt_recent;
+ int clean;
#endif
};
@@ -398,7 +399,8 @@ static void recent_mt_destroy(const struct xt_mtdtor_param *par)
list_del(&t->list);
spin_unlock_bh(&recent_lock);
#ifdef CONFIG_PROC_FS
- remove_proc_entry(t->name, recent_net->xt_recent);
+ if(!recent_net->clean)
+ remove_proc_entry(t->name, recent_net->xt_recent);
#endif
recent_table_flush(t);
kfree(t);
@@ -599,15 +601,26 @@ static int __net_init recent_net_init(struct net *net)
{
struct recent_net *recent_net = recent_pernet(net);
+#ifdef CONFIG_PROC_FS
+ recent_net->clean = 0;
+#endif
INIT_LIST_HEAD(&recent_net->tables);
return recent_proc_net_init(net);
}
static void __net_exit recent_net_exit(struct net *net)
{
+#ifdef CONFIG_PROC_FS
struct recent_net *recent_net = recent_pernet(net);
+ struct recent_table *t;
- BUG_ON(!list_empty(&recent_net->tables));
+ spin_lock_bh(&recent_lock);
+ recent_net->clean = 1;
+ list_for_each_entry(t, &recent_net->tables, list) {
+ remove_proc_entry(t->name, recent_net->xt_recent);
+ }
+ spin_unlock_bh(&recent_lock);
+#endif
recent_proc_net_exit(net);
}
next reply other threads:[~2012-12-11 19:06 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-11 19:06 Vitaly E. Lavrov [this message]
2012-12-16 22:50 ` [PATCH] xt_recent fix BUG() Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50C78438.4040102@guap.ru \
--to=lve@guap.ru \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.