|
|
34625f |
From 40edcc35cbfca22d4cb471464eacc12cf7c5c28a Mon Sep 17 00:00:00 2001
|
|
|
34625f |
From: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
34625f |
Date: Wed, 3 Oct 2018 12:09:09 +0200
|
|
|
34625f |
Subject: [PATCH] segtree: disantangle get_set_interval_end()
|
|
|
34625f |
|
|
|
34625f |
This function overrides the left pointer. Instead update this function
|
|
|
34625f |
to return the range that we found to enclose the left element. Note that
|
|
|
34625f |
we may not find a closing right element - therefore, it is a standalone
|
|
|
34625f |
element - in that case this function returns NULL.
|
|
|
34625f |
|
|
|
34625f |
Reported-by: Phil Sutter <phil@nwl.cc>
|
|
|
34625f |
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
34625f |
(cherry picked from commit 33eb4594a1c764776a46b48bc1a7d726b561359d)
|
|
|
34625f |
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
|
34625f |
---
|
|
|
34625f |
src/segtree.c | 37 ++++++++++++++++++++++---------------
|
|
|
34625f |
1 file changed, 22 insertions(+), 15 deletions(-)
|
|
|
34625f |
|
|
|
34625f |
diff --git a/src/segtree.c b/src/segtree.c
|
|
|
34625f |
index 288b01f420a48..0d53c83fd837e 100644
|
|
|
34625f |
--- a/src/segtree.c
|
|
|
34625f |
+++ b/src/segtree.c
|
|
|
34625f |
@@ -681,9 +681,9 @@ static struct expr *get_set_interval_end(const struct table *table,
|
|
|
34625f |
const char *set_name,
|
|
|
34625f |
struct expr *left)
|
|
|
34625f |
{
|
|
|
34625f |
+ struct expr *i, *range = NULL;
|
|
|
34625f |
struct set *set;
|
|
|
34625f |
mpz_t low, high;
|
|
|
34625f |
- struct expr *i;
|
|
|
34625f |
|
|
|
34625f |
set = set_lookup(table, set_name);
|
|
|
34625f |
mpz_init2(low, set->key->len);
|
|
|
34625f |
@@ -694,9 +694,9 @@ static struct expr *get_set_interval_end(const struct table *table,
|
|
|
34625f |
case EXPR_RANGE:
|
|
|
34625f |
range_expr_value_low(low, i);
|
|
|
34625f |
if (mpz_cmp(low, left->key->value) == 0) {
|
|
|
34625f |
- left = range_expr_alloc(&internal_location,
|
|
|
34625f |
- expr_clone(left->key),
|
|
|
34625f |
- expr_clone(i->key->right));
|
|
|
34625f |
+ range = range_expr_alloc(&internal_location,
|
|
|
34625f |
+ expr_clone(left->key),
|
|
|
34625f |
+ expr_clone(i->key->right));
|
|
|
34625f |
break;
|
|
|
34625f |
}
|
|
|
34625f |
break;
|
|
|
34625f |
@@ -708,12 +708,12 @@ static struct expr *get_set_interval_end(const struct table *table,
|
|
|
34625f |
mpz_clear(low);
|
|
|
34625f |
mpz_clear(high);
|
|
|
34625f |
|
|
|
34625f |
- return left;
|
|
|
34625f |
+ return range;
|
|
|
34625f |
}
|
|
|
34625f |
|
|
|
34625f |
int get_set_decompose(struct table *table, struct set *set)
|
|
|
34625f |
{
|
|
|
34625f |
- struct expr *i, *next, *new;
|
|
|
34625f |
+ struct expr *i, *next, *range;
|
|
|
34625f |
struct expr *left = NULL;
|
|
|
34625f |
struct expr *new_init;
|
|
|
34625f |
|
|
|
34625f |
@@ -724,28 +724,35 @@ int get_set_decompose(struct table *table, struct set *set)
|
|
|
34625f |
list_del(&left->list);
|
|
|
34625f |
list_del(&i->list);
|
|
|
34625f |
mpz_sub_ui(i->key->value, i->key->value, 1);
|
|
|
34625f |
- new = get_set_interval_find(table, set->handle.set.name,
|
|
|
34625f |
+ range = get_set_interval_find(table, set->handle.set.name,
|
|
|
34625f |
left, i);
|
|
|
34625f |
- if (!new) {
|
|
|
34625f |
+ if (!range) {
|
|
|
34625f |
errno = ENOENT;
|
|
|
34625f |
return -1;
|
|
|
34625f |
}
|
|
|
34625f |
|
|
|
34625f |
- compound_expr_add(new_init, new);
|
|
|
34625f |
+ compound_expr_add(new_init, range);
|
|
|
34625f |
left = NULL;
|
|
|
34625f |
} else {
|
|
|
34625f |
if (left) {
|
|
|
34625f |
- left = get_set_interval_end(table,
|
|
|
34625f |
- set->handle.set.name,
|
|
|
34625f |
- left);
|
|
|
34625f |
- compound_expr_add(new_init, left);
|
|
|
34625f |
+ range = get_set_interval_end(table,
|
|
|
34625f |
+ set->handle.set.name,
|
|
|
34625f |
+ left);
|
|
|
34625f |
+ if (range)
|
|
|
34625f |
+ compound_expr_add(new_init, range);
|
|
|
34625f |
+ else
|
|
|
34625f |
+ compound_expr_add(new_init,
|
|
|
34625f |
+ expr_clone(left));
|
|
|
34625f |
}
|
|
|
34625f |
left = i;
|
|
|
34625f |
}
|
|
|
34625f |
}
|
|
|
34625f |
if (left) {
|
|
|
34625f |
- left = get_set_interval_end(table, set->handle.set.name, left);
|
|
|
34625f |
- compound_expr_add(new_init, left);
|
|
|
34625f |
+ range = get_set_interval_end(table, set->handle.set.name, left);
|
|
|
34625f |
+ if (range)
|
|
|
34625f |
+ compound_expr_add(new_init, left);
|
|
|
34625f |
+ else
|
|
|
34625f |
+ compound_expr_add(new_init, expr_clone(left));
|
|
|
34625f |
}
|
|
|
34625f |
|
|
|
34625f |
set->init = new_init;
|
|
|
34625f |
--
|
|
|
34625f |
2.19.0
|
|
|
34625f |
|