提交 90d2723c 编写于 作者: P Pablo Neira Ayuso

netfilter: nf_tables: do not hold reference on netdevice from preparation phase

The netfilter netdevice event handler hold the nfnl_lock mutex, this
avoids races with a device going away while such device is being
attached to hooks from the netlink control plane. Therefore, either
control plane bails out with ENOENT or netdevice event path waits until
the hook that is attached to net_device is registered.
Signed-off-by: NPablo Neira Ayuso <pablo@netfilter.org>
上级 d92191aa
...@@ -1288,8 +1288,6 @@ static void nf_tables_chain_destroy(struct nft_chain *chain) ...@@ -1288,8 +1288,6 @@ static void nf_tables_chain_destroy(struct nft_chain *chain)
free_percpu(basechain->stats); free_percpu(basechain->stats);
if (basechain->stats) if (basechain->stats)
static_branch_dec(&nft_counters_enabled); static_branch_dec(&nft_counters_enabled);
if (basechain->ops.dev != NULL)
dev_put(basechain->ops.dev);
kfree(chain->name); kfree(chain->name);
kfree(basechain); kfree(basechain);
} else { } else {
...@@ -1356,7 +1354,7 @@ static int nft_chain_parse_hook(struct net *net, ...@@ -1356,7 +1354,7 @@ static int nft_chain_parse_hook(struct net *net,
} }
nla_strlcpy(ifname, ha[NFTA_HOOK_DEV], IFNAMSIZ); nla_strlcpy(ifname, ha[NFTA_HOOK_DEV], IFNAMSIZ);
dev = dev_get_by_name(net, ifname); dev = __dev_get_by_name(net, ifname);
if (!dev) { if (!dev) {
module_put(type->owner); module_put(type->owner);
return -ENOENT; return -ENOENT;
...@@ -1373,8 +1371,6 @@ static int nft_chain_parse_hook(struct net *net, ...@@ -1373,8 +1371,6 @@ static int nft_chain_parse_hook(struct net *net,
static void nft_chain_release_hook(struct nft_chain_hook *hook) static void nft_chain_release_hook(struct nft_chain_hook *hook)
{ {
module_put(hook->type->owner); module_put(hook->type->owner);
if (hook->dev != NULL)
dev_put(hook->dev);
} }
static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask,
...@@ -4948,7 +4944,7 @@ static int nf_tables_parse_devices(const struct nft_ctx *ctx, ...@@ -4948,7 +4944,7 @@ static int nf_tables_parse_devices(const struct nft_ctx *ctx,
} }
nla_strlcpy(ifname, tmp, IFNAMSIZ); nla_strlcpy(ifname, tmp, IFNAMSIZ);
dev = dev_get_by_name(ctx->net, ifname); dev = __dev_get_by_name(ctx->net, ifname);
if (!dev) { if (!dev) {
err = -ENOENT; err = -ENOENT;
goto err1; goto err1;
...@@ -5007,10 +5003,8 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx, ...@@ -5007,10 +5003,8 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx,
return err; return err;
ops = kzalloc(sizeof(struct nf_hook_ops) * n, GFP_KERNEL); ops = kzalloc(sizeof(struct nf_hook_ops) * n, GFP_KERNEL);
if (!ops) { if (!ops)
err = -ENOMEM; return -ENOMEM;
goto err1;
}
flowtable->hooknum = hooknum; flowtable->hooknum = hooknum;
flowtable->priority = priority; flowtable->priority = priority;
...@@ -5028,11 +5022,6 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx, ...@@ -5028,11 +5022,6 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx,
GFP_KERNEL); GFP_KERNEL);
} }
err = 0;
err1:
for (i = 0; i < n; i++)
dev_put(dev_array[i]);
return err; return err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册