Message ID | 20240321000635.31865-4-pablo@netfilter.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,1/3] netfilter: nft_set_pipapo: release elements in clone only from destroy path | expand |
On Thu, 2024-03-21 at 01:06 +0100, Pablo Neira Ayuso wrote: > From: Quan Tian <tianquan23@gmail.com> > > If nft_netdev_register_hooks() fails, the memory associated with > nft_stats is not freed, causing a memory leak. > > This patch fixes it by moving nft_stats_alloc() down after > nft_netdev_register_hooks() succeeds. > > Fixes: b9703ed44ffb ("netfilter: nf_tables: support for adding new devices to an existing netdev chain") > Signed-off-by: Quan Tian <tianquan23@gmail.com> I'm sorry for nit-picking, but our tag verification scripts are unhappy WRT this commit, it lacks your SoB. Would you mind sending an updated PR? Thanks! Paolo
On Thu, Mar 21, 2024 at 11:52:29AM +0100, Paolo Abeni wrote: > On Thu, 2024-03-21 at 01:06 +0100, Pablo Neira Ayuso wrote: > > From: Quan Tian <tianquan23@gmail.com> > > > > If nft_netdev_register_hooks() fails, the memory associated with > > nft_stats is not freed, causing a memory leak. > > > > This patch fixes it by moving nft_stats_alloc() down after > > nft_netdev_register_hooks() succeeds. > > > > Fixes: b9703ed44ffb ("netfilter: nf_tables: support for adding new devices to an existing netdev chain") > > Signed-off-by: Quan Tian <tianquan23@gmail.com> > > I'm sorry for nit-picking, but our tag verification scripts are unhappy > WRT this commit, it lacks your SoB. Would you mind sending an updated > PR? Sure, sorry about this.
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 984c1c83ee38..5fa3d3540c93 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -2631,19 +2631,6 @@ static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy, } } - if (nla[NFTA_CHAIN_COUNTERS]) { - if (!nft_is_base_chain(chain)) { - err = -EOPNOTSUPP; - goto err_hooks; - } - - stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); - if (IS_ERR(stats)) { - err = PTR_ERR(stats); - goto err_hooks; - } - } - if (!(table->flags & NFT_TABLE_F_DORMANT) && nft_is_base_chain(chain) && !list_empty(&hook.list)) { @@ -2658,6 +2645,20 @@ static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy, } unregister = true; + + if (nla[NFTA_CHAIN_COUNTERS]) { + if (!nft_is_base_chain(chain)) { + err = -EOPNOTSUPP; + goto err_hooks; + } + + stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); + if (IS_ERR(stats)) { + err = PTR_ERR(stats); + goto err_hooks; + } + } + err = -ENOMEM; trans = nft_trans_alloc(ctx, NFT_MSG_NEWCHAIN, sizeof(struct nft_trans_chain));