netfilter: nf_tables: Introduce functions freeing nft_hook objects
authorPhil Sutter <phil@nwl.cc>
Wed, 21 May 2025 20:44:22 +0000 (22:44 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 23 May 2025 11:57:12 +0000 (13:57 +0200)
Pointless wrappers around kfree() for now, prep work for an embedded
list of nf_hook_ops.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_tables_api.c

index b28f6730e26d665bfd1045bb3a65f2c2c49b02fe..9998fcf44a38de1efdb1f7684c3ec4e46e4e5463 100644 (file)
@@ -323,6 +323,16 @@ err_register:
        return err;
 }
 
+static void nft_netdev_hook_free(struct nft_hook *hook)
+{
+       kfree(hook);
+}
+
+static void nft_netdev_hook_free_rcu(struct nft_hook *hook)
+{
+       kfree_rcu(hook, rcu);
+}
+
 static void nft_netdev_unregister_hooks(struct net *net,
                                        struct list_head *hook_list,
                                        bool release_netdev)
@@ -333,7 +343,7 @@ static void nft_netdev_unregister_hooks(struct net *net,
                nf_unregister_net_hook(net, &hook->ops);
                if (release_netdev) {
                        list_del(&hook->list);
-                       kfree_rcu(hook, rcu);
+                       nft_netdev_hook_free_rcu(hook);
                }
        }
 }
@@ -2253,7 +2263,7 @@ void nf_tables_chain_destroy(struct nft_chain *chain)
                        list_for_each_entry_safe(hook, next,
                                                 &basechain->hook_list, list) {
                                list_del_rcu(&hook->list);
-                               kfree_rcu(hook, rcu);
+                               nft_netdev_hook_free_rcu(hook);
                        }
                }
                module_put(basechain->type->owner);
@@ -2345,7 +2355,7 @@ static int nf_tables_parse_netdev_hooks(struct net *net,
                }
                if (nft_hook_list_find(hook_list, hook)) {
                        NL_SET_BAD_ATTR(extack, tmp);
-                       kfree(hook);
+                       nft_netdev_hook_free(hook);
                        err = -EEXIST;
                        goto err_hook;
                }
@@ -2363,7 +2373,7 @@ static int nf_tables_parse_netdev_hooks(struct net *net,
 err_hook:
        list_for_each_entry_safe(hook, next, hook_list, list) {
                list_del(&hook->list);
-               kfree(hook);
+               nft_netdev_hook_free(hook);
        }
        return err;
 }
@@ -2506,7 +2516,7 @@ static void nft_chain_release_hook(struct nft_chain_hook *hook)
 
        list_for_each_entry_safe(h, next, &hook->list, list) {
                list_del(&h->list);
-               kfree(h);
+               nft_netdev_hook_free(h);
        }
        module_put(hook->type->owner);
 }
@@ -2795,7 +2805,7 @@ static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
 
                                if (nft_hook_list_find(&basechain->hook_list, h)) {
                                        list_del(&h->list);
-                                       kfree(h);
+                                       nft_netdev_hook_free(h);
                                }
                        }
                } else {
@@ -2916,7 +2926,7 @@ err_hooks:
                        if (unregister)
                                nf_unregister_net_hook(ctx->net, &h->ops);
                        list_del(&h->list);
-                       kfree_rcu(h, rcu);
+                       nft_netdev_hook_free_rcu(h);
                }
                module_put(hook.type->owner);
        }
@@ -8907,7 +8917,7 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,
                                            FLOW_BLOCK_UNBIND);
                if (release_netdev) {
                        list_del(&hook->list);
-                       kfree_rcu(hook, rcu);
+                       nft_netdev_hook_free_rcu(hook);
                }
        }
 }
@@ -8965,7 +8975,7 @@ err_unregister_net_hooks:
 
                nft_unregister_flowtable_hook(net, flowtable, hook);
                list_del_rcu(&hook->list);
-               kfree_rcu(hook, rcu);
+               nft_netdev_hook_free_rcu(hook);
        }
 
        return err;
@@ -8977,7 +8987,7 @@ static void nft_hooks_destroy(struct list_head *hook_list)
 
        list_for_each_entry_safe(hook, next, hook_list, list) {
                list_del_rcu(&hook->list);
-               kfree_rcu(hook, rcu);
+               nft_netdev_hook_free_rcu(hook);
        }
 }
 
@@ -9001,7 +9011,7 @@ static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh,
        list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
                if (nft_hook_list_find(&flowtable->hook_list, hook)) {
                        list_del(&hook->list);
-                       kfree(hook);
+                       nft_netdev_hook_free(hook);
                }
        }
 
@@ -9048,7 +9058,7 @@ err_flowtable_update_hook:
                if (unregister)
                        nft_unregister_flowtable_hook(ctx->net, flowtable, hook);
                list_del_rcu(&hook->list);
-               kfree_rcu(hook, rcu);
+               nft_netdev_hook_free_rcu(hook);
        }
 
        return err;
@@ -9194,7 +9204,7 @@ static void nft_flowtable_hook_release(struct nft_flowtable_hook *flowtable_hook
 
        list_for_each_entry_safe(this, next, &flowtable_hook->list, list) {
                list_del(&this->list);
-               kfree(this);
+               nft_netdev_hook_free(this);
        }
 }
 
@@ -9557,7 +9567,7 @@ 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) {
                list_del_rcu(&hook->list);
-               kfree_rcu(hook, rcu);
+               nft_netdev_hook_free_rcu(hook);
        }
        kfree(flowtable->name);
        module_put(flowtable->data.type->owner);