Skip to content

Commit 7d5570c

Browse files
committed
netfilter: nf_tables: check for unset NFTA_SET_ELEM_LIST_ELEMENTS attribute
Otherwise, the kernel oopses in nla_for_each_nested when iterating over the unset attribute NFTA_SET_ELEM_LIST_ELEMENTS in the nf_tables_{new,del}setelem() path. netlink: 65524 bytes leftover after parsing attributes in process `nft'. [...] Oops: 0000 [#1] SMP [...] CPU: 2 PID: 6287 Comm: nft Not tainted 3.16.0-rc2+ torvalds#169 RIP: 0010:[<ffffffffa0526e61>] [<ffffffffa0526e61>] nf_tables_newsetelem+0x82/0xec [nf_tables] [...] Call Trace: [<ffffffffa05178c4>] nfnetlink_rcv+0x2e7/0x3d7 [nfnetlink] [<ffffffffa0517939>] ? nfnetlink_rcv+0x35c/0x3d7 [nfnetlink] [<ffffffff8137d300>] netlink_unicast+0xf8/0x17a [<ffffffff8137d6a5>] netlink_sendmsg+0x323/0x351 [...] Fix this by returning -EINVAL if this attribute is not set, which doesn't make sense at all since those commands are there to add and to delete elements from the set. Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent b6d0468 commit 7d5570c

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

net/netfilter/nf_tables_api.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3073,6 +3073,9 @@ static int nf_tables_newsetelem(struct sock *nlsk, struct sk_buff *skb,
30733073
struct nft_ctx ctx;
30743074
int rem, err = 0;
30753075

3076+
if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
3077+
return -EINVAL;
3078+
30763079
err = nft_ctx_init_from_elemattr(&ctx, skb, nlh, nla, true);
30773080
if (err < 0)
30783081
return err;
@@ -3156,6 +3159,9 @@ static int nf_tables_delsetelem(struct sock *nlsk, struct sk_buff *skb,
31563159
struct nft_ctx ctx;
31573160
int rem, err = 0;
31583161

3162+
if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
3163+
return -EINVAL;
3164+
31593165
err = nft_ctx_init_from_elemattr(&ctx, skb, nlh, nla, false);
31603166
if (err < 0)
31613167
return err;

0 commit comments

Comments
 (0)