diff options
author | Oleksandr Natalenko <oleksandr@natalenko.name> | 2017-01-02 20:54:09 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2017-01-03 02:49:32 +0100 |
commit | 2faa5ddb658034d1ef5300d46610bd2df5fdd39f (patch) | |
tree | e76a167e2d9e20008bf4ae7981433efb193d0d58 /src/segtree.c | |
parent | 87efdaf0a7a804cda24749246b26772bbdcaef5e (diff) |
segtree: allocate memory for arrays on heap
Huge sets may cause stack to be exhausted.
So, put allocate memory for arrays in
interval_map_decompose() function on heap.
Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src/segtree.c')
-rw-r--r-- | src/segtree.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/segtree.c b/src/segtree.c index 5b6cdd1d..78657de1 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -608,12 +608,18 @@ static int expr_value_cmp(const void *p1, const void *p2) void interval_map_decompose(struct expr *set) { - struct expr *elements[set->size], *ranges[set->size * 2]; + struct expr **elements, **ranges; struct expr *i, *next, *low = NULL, *end; unsigned int n, m, size; mpz_t range, p; bool interval; + if (set->size == 0) + return; + + elements = xmalloc_array(set->size, sizeof(struct expr *)); + ranges = xmalloc_array(set->size * 2, sizeof(struct expr *)); + mpz_init(range); mpz_init(p); @@ -728,4 +734,7 @@ void interval_map_decompose(struct expr *set) compound_expr_add(set, i); } + + xfree(ranges); + xfree(elements); } |