]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
segtree: Fix for last elem at interval end
authorPhil Sutter <phil@nwl.cc>
Fri, 13 Apr 2018 14:52:29 +0000 (16:52 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 14 Apr 2018 11:53:02 +0000 (13:53 +0200)
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>
src/segtree.c
tests/py/ip6/srh.t

index 1970265a9f11c98e96a5a4b58b6aaec1d4c785be..5939d8fc7b4a852f7f4397fcef20bcec726a22a2 100644 (file)
@@ -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);
 
index 442c78f0a8ea3d6d6abd6ca0a24ac8f2ff845fde..fbaff410c8683d4768051ab88d22d5446df3b995 100644 (file)
@@ -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