summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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