netfilter: nf_tables: check for unset NFTA_SET_ELEM_LIST_ELEMENTS attribute
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 25 Jul 2014 11:15:36 +0000 (13:15 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 31 Jul 2014 19:11:43 +0000 (21:11 +0200)
commit7d5570ca8972aad58de0b4ad03a5e991c41d4ce2
tree011475fa651a86a0579c2b77e8714b91dbb4d213
parentb6d04688040218d66edd8b221e43c67240b83119
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+ #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 <pablo@netfilter.org>
net/netfilter/nf_tables_api.c