summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2018-04-13 16:52:29 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2018-04-14 13:53:02 +0200
commit2f97139ceab4b677c912fb96106400048ad57f0a (patch)
tree9f892ee11af009b1910700246e7c8576253e57ba
parentebc3f6636bd5a3c54350d9ed06c1785cb6cc37be (diff)
segtree: Fix for last elem at interval end
Unclosed interval check at end of interval_map_decompose() missed to check whether interval start is the last possible element in given set before creating a range expression. This led to the last element incorrectly printed as range from itself to itself. Fix this by comparing the upper boundary against the lower one. In order to keep indenting level low, invert the entry check and jump to the end if it matches. Signed-off-by: Phil Sutter <phil@nwl.cc> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/segtree.c20
-rw-r--r--tests/py/ip6/srh.t6
2 files changed, 15 insertions, 11 deletions
diff --git a/src/segtree.c b/src/segtree.c
index 1970265a..5939d8fc 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -857,21 +857,25 @@ void interval_map_decompose(struct expr *set)
expr_free(i);
}
- /* Unclosed interval */
- if (low != NULL) {
- i = constant_expr_alloc(&low->location, low->dtype,
- low->byteorder, expr_value(low)->len,
- NULL);
- mpz_init_bitmask(i->value, i->len);
+ if (!low) /* no unclosed interval at end */
+ goto out;
+ i = constant_expr_alloc(&low->location, low->dtype,
+ low->byteorder, expr_value(low)->len, NULL);
+ mpz_init_bitmask(i->value, i->len);
+
+ if (!mpz_cmp(i->value, expr_value(low)->value)) {
+ expr_free(i);
+ i = low;
+ } else {
i = range_expr_alloc(&low->location, expr_value(low), i);
i = set_elem_expr_alloc(&low->location, i);
if (low->ops->type == EXPR_MAPPING)
i = mapping_expr_alloc(&i->location, i, low->right);
-
- compound_expr_add(set, i);
}
+ compound_expr_add(set, i);
+out:
mpz_clear(range);
mpz_clear(p);
diff --git a/tests/py/ip6/srh.t b/tests/py/ip6/srh.t
index 442c78f0..fbaff410 100644
--- a/tests/py/ip6/srh.t
+++ b/tests/py/ip6/srh.t
@@ -4,15 +4,15 @@
srh last-entry 0;ok
srh last-entry 127;ok
-srh last-entry { 0, 4-127, 255 };ok;srh last-entry { 0, 4-127, 255-255}
+srh last-entry { 0, 4-127, 255 };ok
srh flags 0;ok
srh flags 127;ok
-srh flags { 0, 4-127, 255 };ok;srh flags { 0, 4-127, 255-255}
+srh flags { 0, 4-127, 255 };ok
srh tag 0;ok
srh tag 127;ok
-srh tag { 0, 4-127, 0xffff };ok;srh tag { 0, 4-127, 65535-65535}
+srh tag { 0, 4-127, 0xffff };ok;srh tag { 0, 4-127, 65535 }
srh sid[1] dead::beef;ok
srh sid[2] dead::beef;ok