summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2013-04-09 08:57:19 +0000
committerPablo Neira Ayuso <pablo@netfilter.org>2013-04-09 21:02:11 +0200
commit02f815cb6d3f57914228be84df9613ee5a01c2e6 (patch)
tree3f128f1952955a34a462f243cf582482e4764543
parent3a7b21eaf4fb3c971bdb47a98f570550ddfe4471 (diff)
downloadlinux-3.10-02f815cb6d3f57914228be84df9613ee5a01c2e6.tar.gz
linux-3.10-02f815cb6d3f57914228be84df9613ee5a01c2e6.tar.bz2
linux-3.10-02f815cb6d3f57914228be84df9613ee5a01c2e6.zip
netfilter: ipset: list:set: fix reference counter update
The last element can be replaced or pushed off and in both cases the reference counter must be updated. Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/netfilter/ipset/ip_set_list_set.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c
index 8371c2bac2e..09c744aa898 100644
--- a/net/netfilter/ipset/ip_set_list_set.c
+++ b/net/netfilter/ipset/ip_set_list_set.c
@@ -174,9 +174,13 @@ list_set_add(struct list_set *map, u32 i, ip_set_id_t id,
{
const struct set_elem *e = list_set_elem(map, i);
- if (i == map->size - 1 && e->id != IPSET_INVALID_ID)
- /* Last element replaced: e.g. add new,before,last */
- ip_set_put_byindex(e->id);
+ if (e->id != IPSET_INVALID_ID) {
+ const struct set_elem *x = list_set_elem(map, map->size - 1);
+
+ /* Last element replaced or pushed off */
+ if (x->id != IPSET_INVALID_ID)
+ ip_set_put_byindex(x->id);
+ }
if (with_timeout(map->timeout))
list_elem_tadd(map, i, id, ip_set_timeout_set(timeout));
else