summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2018-04-13 16:52:27 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2018-04-14 13:53:02 +0200
commit23a6c8ccdd293a2c3448e5e197cd0384bef767cb (patch)
tree03bffc4a95f922a059dbe07d68a93fd13b0b4e46
parent438dddb2146f21c971e552753c7e9488e3c8b193 (diff)
segtree: Fix memory leaks
This fixes memory leaks in three places: * set_overlap(): The allocated intervals have to be freed again before returning to caller. While being at it, reduce indenting level in said function to stay below 80 columns boundary. * range_is_prefix(): * interval_map_decompose(): GMP documentation suggests to call mpz_clear() for all mpz_t type variables once they are not used anymore to free the space they occupy. Signed-off-by: Phil Sutter <phil@nwl.cc> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/segtree.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/segtree.c b/src/segtree.c
index f8d62d7a..1970265a 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -359,20 +359,29 @@ static int set_overlap(struct list_head *msgs, const struct set *set,
struct elementary_interval *new_intervals[init->size];
struct elementary_interval *intervals[set->init->size];
unsigned int n, m, i, j;
+ int ret = 0;
n = expr_to_intervals(init, keylen, new_intervals);
m = expr_to_intervals(set->init, keylen, intervals);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
- if (interval_overlap(new_intervals[i], intervals[j]))
- return expr_error(msgs,
- new_intervals[i]->expr,
- "interval overlaps with an existing one");
+ if (!interval_overlap(new_intervals[i], intervals[j]))
+ continue;
+
+ expr_error(msgs, new_intervals[i]->expr,
+ "interval overlaps with an existing one");
+ ret = -1;
+ goto out;
}
}
+out:
+ for (i = 0; i < n; i++)
+ ei_destroy(new_intervals[i]);
+ for (i = 0; i < m; i++)
+ ei_destroy(intervals[i]);
- return 0;
+ return ret;
}
static int set_to_segtree(struct list_head *msgs, struct set *set,
@@ -695,11 +704,14 @@ void get_set_decompose(struct table *table, struct set *set)
static bool range_is_prefix(const mpz_t range)
{
mpz_t tmp;
+ bool ret;
mpz_init_set(tmp, range);
mpz_add_ui(tmp, tmp, 1);
mpz_and(tmp, range, tmp);
- return !mpz_cmp_ui(tmp, 0);
+ ret = !mpz_cmp_ui(tmp, 0);
+ mpz_clear(tmp);
+ return ret;
}
static struct expr *expr_value(struct expr *expr)
@@ -860,6 +872,9 @@ void interval_map_decompose(struct expr *set)
compound_expr_add(set, i);
}
+ mpz_clear(range);
+ mpz_clear(p);
+
xfree(ranges);
xfree(elements);
}