summaryrefslogtreecommitdiffstats
path: root/src/segtree.c
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2019-11-14 14:41:50 +0100
committerPhil Sutter <phil@nwl.cc>2019-11-15 10:50:58 +0100
commit4a8831b52b1c83322e288078120d834b78ff489a (patch)
tree2a10d927e3e86664a46216b3467b080ba0dabcfa /src/segtree.c
parentdecc12ec2dc319a9bb1fb5f629258c6c3a087db1 (diff)
segtree: Fix get element for little endian ranges
This fixes get element command for interval sets with host byte order data type, like e.g. mark. During serializing of the range (or element) to query, data was exported in wrong byteorder and consequently not found in kernel. The mystery part is that code seemed correct: When calling constant_expr_alloc() from set_elem_add(), the set key's byteorder was passed with correct value of BYTEORDER_HOST_ENDIAN. Comparison with delete/add element code paths though turned out that in those use-cases, constant_expr_alloc() is called with BYTEORDER_INVALID: - seg_tree_init() takes byteorder field value of first element in init->expressions (i.e., the elements requested on command line) and assigns that to tree->byteorder - tree->byteorder is passed to constant_expr_alloc() in set_insert_interval() - the elements' byteorder happens to be the default value This patch may not fix the right side, but at least it aligns get with add/delete element codes. Fixes: a43cc8d53096d ("src: support for get element command") Signed-off-by: Phil Sutter <phil@nwl.cc> Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/segtree.c')
-rw-r--r--src/segtree.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/segtree.c b/src/segtree.c
index 10c82eed..9f1eecc0 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -622,12 +622,12 @@ int set_to_intervals(struct list_head *errs, struct set *set,
}
static void set_elem_add(const struct set *set, struct expr *init, mpz_t value,
- uint32_t flags)
+ uint32_t flags, enum byteorder byteorder)
{
struct expr *expr;
expr = constant_expr_alloc(&internal_location, set->key->dtype,
- set->key->byteorder, set->key->len, NULL);
+ byteorder, set->key->len, NULL);
mpz_set(expr->value, value);
expr = set_elem_expr_alloc(&internal_location, expr);
expr->flags = flags;
@@ -649,14 +649,16 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init)
list_for_each_entry(i, &init->expressions, list) {
switch (i->key->etype) {
case EXPR_VALUE:
- set_elem_add(set, new_init, i->key->value, i->flags);
+ set_elem_add(set, new_init, i->key->value,
+ i->flags, i->byteorder);
break;
default:
range_expr_value_low(low, i);
- set_elem_add(set, new_init, low, 0);
+ set_elem_add(set, new_init, low, 0, i->byteorder);
range_expr_value_high(high, i);
mpz_add_ui(high, high, 1);
- set_elem_add(set, new_init, high, EXPR_F_INTERVAL_END);
+ set_elem_add(set, new_init, high,
+ EXPR_F_INTERVAL_END, i->byteorder);
break;
}
}