netfilter: ipset: list:set: make sure all elements are checked by the gc
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 9 Sep 2013 15:10:20 +0000 (17:10 +0200)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 30 Sep 2013 19:33:27 +0000 (21:33 +0200)
When an element timed out, the next one was skipped by the garbage
collector, fixed.

Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
net/netfilter/ipset/ip_set_list_set.c

index e44986af1fc2103050d3d6ffa38284aa1ca8e002..30bf1dd11f04133e40071e023aad31579a450de3 100644 (file)
@@ -218,13 +218,16 @@ set_cleanup_entries(struct ip_set *set)
 {
        struct list_set *map = set->data;
        struct set_elem *e;
-       u32 i;
+       u32 i = 0;
 
-       for (i = 0; i < map->size; i++) {
+       while (i < map->size) {
                e = list_set_elem(set, map, i);
                if (e->id != IPSET_INVALID_ID &&
                    ip_set_timeout_expired(ext_timeout(e, set)))
                        list_set_del(set, i);
+                       /* Check element moved to position i in next loop */
+               else
+                       i++;
        }
 }