* [PATCH nf] netfilter: nf_tables: imbalance in flowtable binding
@ 2025-01-02 15:44 Pablo Neira Ayuso
2025-01-03 17:37 ` Phil Sutter
0 siblings, 1 reply; 3+ messages in thread
From: Pablo Neira Ayuso @ 2025-01-02 15:44 UTC (permalink / raw)
To: netfilter-devel
All these cases cause imbalance between BIND and UNBIND calls:
- Delete an interface from a flowtable with multiple interfaces
- Add a (device to a) flowtable with --check flag
- Delete a netns containing a flowtable
- In an interactive nft session, create a table with owner flag and
flowtable inside, then quit.
Fix it by calling FLOW_BLOCK_UNBIND when unregistering hooks, then
remove late FLOW_BLOCK_UNBIND call when destroying flowtable.
Fixes: ff4bf2f42a40 ("netfilter: nf_tables: add nft_unregister_flowtable_hook()")
Reported-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/nf_tables_api.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 0b9f1e8dfe49..c4af283356e7 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -8822,6 +8822,7 @@ static void nft_unregister_flowtable_hook(struct net *net,
}
static void __nft_unregister_flowtable_net_hooks(struct net *net,
+ struct nft_flowtable *flowtable,
struct list_head *hook_list,
bool release_netdev)
{
@@ -8829,6 +8830,8 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,
list_for_each_entry_safe(hook, next, hook_list, list) {
nf_unregister_net_hook(net, &hook->ops);
+ flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
+ FLOW_BLOCK_UNBIND);
if (release_netdev) {
list_del(&hook->list);
kfree_rcu(hook, rcu);
@@ -8837,9 +8840,10 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,
}
static void nft_unregister_flowtable_net_hooks(struct net *net,
+ struct nft_flowtable *flowtable,
struct list_head *hook_list)
{
- __nft_unregister_flowtable_net_hooks(net, hook_list, false);
+ __nft_unregister_flowtable_net_hooks(net, flowtable, hook_list, false);
}
static int nft_register_flowtable_net_hooks(struct net *net,
@@ -9481,8 +9485,6 @@ static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
flowtable->data.type->free(&flowtable->data);
list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
- flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
- FLOW_BLOCK_UNBIND);
list_del_rcu(&hook->list);
kfree_rcu(hook, rcu);
}
@@ -10870,6 +10872,7 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
&nft_trans_flowtable_hooks(trans),
trans->msg_type);
nft_unregister_flowtable_net_hooks(net,
+ nft_trans_flowtable(trans),
&nft_trans_flowtable_hooks(trans));
} else {
list_del_rcu(&nft_trans_flowtable(trans)->list);
@@ -10878,6 +10881,7 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
NULL,
trans->msg_type);
nft_unregister_flowtable_net_hooks(net,
+ nft_trans_flowtable(trans),
&nft_trans_flowtable(trans)->hook_list);
}
break;
@@ -11140,11 +11144,13 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
case NFT_MSG_NEWFLOWTABLE:
if (nft_trans_flowtable_update(trans)) {
nft_unregister_flowtable_net_hooks(net,
+ nft_trans_flowtable(trans),
&nft_trans_flowtable_hooks(trans));
} else {
nft_use_dec_restore(&table->use);
list_del_rcu(&nft_trans_flowtable(trans)->list);
nft_unregister_flowtable_net_hooks(net,
+ nft_trans_flowtable(trans),
&nft_trans_flowtable(trans)->hook_list);
}
break;
@@ -11737,7 +11743,8 @@ static void __nft_release_hook(struct net *net, struct nft_table *table)
list_for_each_entry(chain, &table->chains, list)
__nf_tables_unregister_hook(net, table, chain, true);
list_for_each_entry(flowtable, &table->flowtables, list)
- __nft_unregister_flowtable_net_hooks(net, &flowtable->hook_list,
+ __nft_unregister_flowtable_net_hooks(net, flowtable,
+ &flowtable->hook_list,
true);
}
--
2.30.2
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH nf] netfilter: nf_tables: imbalance in flowtable binding
2025-01-02 15:44 [PATCH nf] netfilter: nf_tables: imbalance in flowtable binding Pablo Neira Ayuso
@ 2025-01-03 17:37 ` Phil Sutter
2025-01-03 17:39 ` Pablo Neira Ayuso
0 siblings, 1 reply; 3+ messages in thread
From: Phil Sutter @ 2025-01-03 17:37 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter-devel
Hi Pablo,
On Thu, Jan 02, 2025 at 04:44:43PM +0100, Pablo Neira Ayuso wrote:
> All these cases cause imbalance between BIND and UNBIND calls:
>
> - Delete an interface from a flowtable with multiple interfaces
>
> - Add a (device to a) flowtable with --check flag
>
> - Delete a netns containing a flowtable
>
> - In an interactive nft session, create a table with owner flag and
> flowtable inside, then quit.
>
> Fix it by calling FLOW_BLOCK_UNBIND when unregistering hooks, then
> remove late FLOW_BLOCK_UNBIND call when destroying flowtable.
>
> Fixes: ff4bf2f42a40 ("netfilter: nf_tables: add nft_unregister_flowtable_hook()")
> Reported-by: Phil Sutter <phil@nwl.cc>
> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Tested-by: Phil Sutter <phil@nwl.cc>
Added printk calls for debugging and recreated the above scenarios, no
imbalance found. Thanks for your fix!
I have to rebase my pending patch series upon this one now. :)
Cheers, Phil
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH nf] netfilter: nf_tables: imbalance in flowtable binding
2025-01-03 17:37 ` Phil Sutter
@ 2025-01-03 17:39 ` Pablo Neira Ayuso
0 siblings, 0 replies; 3+ messages in thread
From: Pablo Neira Ayuso @ 2025-01-03 17:39 UTC (permalink / raw)
To: Phil Sutter, netfilter-devel
On Fri, Jan 03, 2025 at 06:37:07PM +0100, Phil Sutter wrote:
> Hi Pablo,
>
> On Thu, Jan 02, 2025 at 04:44:43PM +0100, Pablo Neira Ayuso wrote:
> > All these cases cause imbalance between BIND and UNBIND calls:
> >
> > - Delete an interface from a flowtable with multiple interfaces
> >
> > - Add a (device to a) flowtable with --check flag
> >
> > - Delete a netns containing a flowtable
> >
> > - In an interactive nft session, create a table with owner flag and
> > flowtable inside, then quit.
> >
> > Fix it by calling FLOW_BLOCK_UNBIND when unregistering hooks, then
> > remove late FLOW_BLOCK_UNBIND call when destroying flowtable.
> >
> > Fixes: ff4bf2f42a40 ("netfilter: nf_tables: add nft_unregister_flowtable_hook()")
> > Reported-by: Phil Sutter <phil@nwl.cc>
> > Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
>
> Tested-by: Phil Sutter <phil@nwl.cc>
>
> Added printk calls for debugging and recreated the above scenarios, no
> imbalance found. Thanks for your fix!
Thanks for testing.
> I have to rebase my pending patch series upon this one now. :)
Please go ahead, thanks Phil.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-01-03 17:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-02 15:44 [PATCH nf] netfilter: nf_tables: imbalance in flowtable binding Pablo Neira Ayuso
2025-01-03 17:37 ` Phil Sutter
2025-01-03 17:39 ` Pablo Neira Ayuso
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.