netfilter: ipset: Fix reported memory size for hash:* types
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Wed, 4 Nov 2015 08:44:29 +0000 (09:44 +0100)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Thu, 10 Nov 2016 12:28:48 +0000 (13:28 +0100)
The calculation of the full allocated memory did not take
into account the size of the base hash bucket structure at some
places.

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

index 1c9b84e53dcc295db3ac4ddcf8b0744b430710ee..88b70fcc5ac5dbba7cf81abe6049a0bdebeaf1e1 100644 (file)
@@ -85,6 +85,8 @@ struct htable {
 };
 
 #define hbucket(h, i)          ((h)->bucket[i])
+#define ext_size(n, dsize)     \
+       (sizeof(struct hbucket) + (n) * (dsize))
 
 #ifndef IPSET_NET_COUNT
 #define IPSET_NET_COUNT                1
@@ -519,7 +521,7 @@ mtype_expire(struct ip_set *set, struct htype *h)
                                d++;
                        }
                        tmp->pos = d;
-                       set->ext_size -= AHASH_INIT_SIZE * dsize;
+                       set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize);
                        rcu_assign_pointer(hbucket(t, i), tmp);
                        kfree_rcu(n, rcu);
                }
@@ -625,7 +627,7 @@ retry:
                                        goto cleanup;
                                }
                                m->size = AHASH_INIT_SIZE;
-                               extsize = sizeof(*m) + AHASH_INIT_SIZE * dsize;
+                               extsize = ext_size(AHASH_INIT_SIZE, dsize);
                                RCU_INIT_POINTER(hbucket(t, key), m);
                        } else if (m->pos >= m->size) {
                                struct hbucket *ht;
@@ -645,7 +647,7 @@ retry:
                                memcpy(ht, m, sizeof(struct hbucket) +
                                              m->size * dsize);
                                ht->size = m->size + AHASH_INIT_SIZE;
-                               extsize += AHASH_INIT_SIZE * dsize;
+                               extsize += ext_size(AHASH_INIT_SIZE, dsize);
                                kfree(m);
                                m = ht;
                                RCU_INIT_POINTER(hbucket(t, key), ht);
@@ -727,7 +729,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
                if (!n)
                        return -ENOMEM;
                n->size = AHASH_INIT_SIZE;
-               set->ext_size += sizeof(*n) + AHASH_INIT_SIZE * set->dsize;
+               set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize);
                goto copy_elem;
        }
        for (i = 0; i < n->pos; i++) {
@@ -791,7 +793,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
                memcpy(n, old, sizeof(struct hbucket) +
                       old->size * set->dsize);
                n->size = old->size + AHASH_INIT_SIZE;
-               set->ext_size += AHASH_INIT_SIZE * set->dsize;
+               set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize);
        }
 
 copy_elem:
@@ -883,7 +885,7 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext,
                                k++;
                }
                if (n->pos == 0 && k == 0) {
-                       set->ext_size -= sizeof(*n) + n->size * dsize;
+                       set->ext_size -= ext_size(n->size, dsize);
                        rcu_assign_pointer(hbucket(t, key), NULL);
                        kfree_rcu(n, rcu);
                } else if (k >= AHASH_INIT_SIZE) {
@@ -902,7 +904,7 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext,
                                k++;
                        }
                        tmp->pos = k;
-                       set->ext_size -= AHASH_INIT_SIZE * dsize;
+                       set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize);
                        rcu_assign_pointer(hbucket(t, key), tmp);
                        kfree_rcu(n, rcu);
                }