Skip to content

Commit b65504e

Browse files
Phil Sutterummakynes
authored andcommitted
netfilter: nfnetlink: New NFNLA_HOOK_INFO_DESC helper
Introduce a helper routine adding the nested attribute for use by a second caller later. Note how this introduces cancelling of 'nest2' for categorical reasons. Since always followed by cancelling of the outer 'nest', it is technically not needed. Signed-off-by: Phil Sutter <phil@nwl.cc> Reviewed-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent bfabc4f commit b65504e

1 file changed

Lines changed: 25 additions & 22 deletions

File tree

net/netfilter/nfnetlink_hook.c

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,30 @@ static int nfnl_hook_put_bpf_prog_info(struct sk_buff *nlskb,
109109
return -EMSGSIZE;
110110
}
111111

112+
static int nfnl_hook_put_nft_info_desc(struct sk_buff *nlskb, const char *tname,
113+
const char *name, u8 family)
114+
{
115+
struct nlattr *nest;
116+
117+
nest = nla_nest_start(nlskb, NFNLA_HOOK_INFO_DESC);
118+
if (!nest ||
119+
nla_put_string(nlskb, NFNLA_CHAIN_TABLE, tname) ||
120+
nla_put_string(nlskb, NFNLA_CHAIN_NAME, name) ||
121+
nla_put_u8(nlskb, NFNLA_CHAIN_FAMILY, family)) {
122+
nla_nest_cancel(nlskb, nest);
123+
return -EMSGSIZE;
124+
}
125+
nla_nest_end(nlskb, nest);
126+
return 0;
127+
}
128+
112129
static int nfnl_hook_put_nft_chain_info(struct sk_buff *nlskb,
113130
const struct nfnl_dump_hook_data *ctx,
114131
unsigned int seq,
115132
struct nft_chain *chain)
116133
{
117134
struct net *net = sock_net(nlskb->sk);
118-
struct nlattr *nest, *nest2;
135+
struct nlattr *nest;
119136
int ret = 0;
120137

121138
if (WARN_ON_ONCE(!chain))
@@ -128,29 +145,15 @@ static int nfnl_hook_put_nft_chain_info(struct sk_buff *nlskb,
128145
if (!nest)
129146
return -EMSGSIZE;
130147

131-
nest2 = nla_nest_start(nlskb, NFNLA_HOOK_INFO_DESC);
132-
if (!nest2)
133-
goto cancel_nest;
134-
135-
ret = nla_put_string(nlskb, NFNLA_CHAIN_TABLE, chain->table->name);
136-
if (ret)
137-
goto cancel_nest;
138-
139-
ret = nla_put_string(nlskb, NFNLA_CHAIN_NAME, chain->name);
140-
if (ret)
141-
goto cancel_nest;
142-
143-
ret = nla_put_u8(nlskb, NFNLA_CHAIN_FAMILY, chain->table->family);
144-
if (ret)
145-
goto cancel_nest;
148+
ret = nfnl_hook_put_nft_info_desc(nlskb, chain->table->name,
149+
chain->name, chain->table->family);
150+
if (ret) {
151+
nla_nest_cancel(nlskb, nest);
152+
return ret;
153+
}
146154

147-
nla_nest_end(nlskb, nest2);
148155
nla_nest_end(nlskb, nest);
149-
return ret;
150-
151-
cancel_nest:
152-
nla_nest_cancel(nlskb, nest);
153-
return -EMSGSIZE;
156+
return 0;
154157
}
155158

156159
static int nfnl_hook_dump_one(struct sk_buff *nlskb,

0 commit comments

Comments
 (0)