Skip the closing end element in case this is an open interval. Otherwise, a bogus end element max(type) + 1 is provided, eg. in inet_service, this results as a 0x10000 with end interval flag which is interpreted by the kernel as a matching closing element. Fixes: a43cc8d53096 ("src: support for get element command") Signed-off-by: Pablo Neira Ayuso --- src/segtree.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/segtree.c b/src/segtree.c index a12820bcf1ec..e877814505f4 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -73,12 +73,13 @@ static void set_elem_expr_add(const struct set *set, struct expr *init, struct expr *get_set_intervals(const struct set *set, const struct expr *init) { enum byteorder byteorder = get_key_byteorder(set->key); + mpz_t low, high, mask; struct expr *new_init; - mpz_t low, high; struct expr *i; mpz_init2(low, set->key->len); mpz_init2(high, set->key->len); + mpz_init2(mask, set->key->len); new_init = set_expr_alloc(&internal_location, NULL); @@ -105,6 +106,10 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init) range_expr_value_low(low, i->key); set_elem_expr_add(set, new_init, low, 0, byteorder); range_expr_value_high(high, i->key); + mpz_bitmask(mask, i->len); + if (!mpz_cmp(mask, high)) + break; + mpz_add_ui(high, high, 1); set_elem_expr_add(set, new_init, high, EXPR_F_INTERVAL_END, byteorder); @@ -115,6 +120,7 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init) } } + mpz_clear(mask); mpz_clear(low); mpz_clear(high); -- 2.47.3