aboutgitcodelistschat:MatrixIRC
path: root/cooker/match.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2023-06-09 18:52:16 +0200
committerStefano Brivio <sbrivio@redhat.com>2023-06-09 18:52:38 +0200
commitd4757b140364cd277f7f7f373475eb427003cb42 (patch)
tree159e5da9d3c9f151c99c25ec0e9bffc2222de970 /cooker/match.c
parent65b5eacaa500e702b982c6848e1ffc18094bc9a9 (diff)
downloadseitan-d4757b140364cd277f7f7f373475eb427003cb42.tar
seitan-d4757b140364cd277f7f7f373475eb427003cb42.tar.gz
seitan-d4757b140364cd277f7f7f373475eb427003cb42.tar.bz2
seitan-d4757b140364cd277f7f7f373475eb427003cb42.tar.lz
seitan-d4757b140364cd277f7f7f373475eb427003cb42.tar.xz
seitan-d4757b140364cd277f7f7f373475eb427003cb42.tar.zst
seitan-d4757b140364cd277f7f7f373475eb427003cb42.zip
cooker: Pass arguments to filter
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'cooker/match.c')
-rw-r--r--cooker/match.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/cooker/match.c b/cooker/match.c
index 5fd46db..374f277 100644
--- a/cooker/match.c
+++ b/cooker/match.c
@@ -79,8 +79,8 @@ static union value parse_field(struct gluten_ctx *g,
int index, struct field *f, JSON_Value *jvalue)
{
struct gluten_offset const_offset, mask_offset, data_offset;
+ union value v = NO_VALUE, mask = NO_VALUE;
struct gluten_offset seccomp_offset;
- union value v = { .v_num = 0 };
struct field *f_inner;
const char *tag_name;
JSON_Object *tmp;
@@ -182,6 +182,7 @@ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
emit_cmp(g, cmp, masked, cmp_offset,
gluten_size[f->type], jump);
+ emit_bpf_arg(index, f->type, cmpterm, set, cmp);
break;
}
@@ -197,8 +198,8 @@ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
v.v_num |= value_get_num(f->desc.d_num, jvalue);
}
} else if (f->flags & MASK) {
- v.v_num = value_get_mask(f->desc.d_num);
- mask_offset = emit_data(g, f->type, 0, &v);
+ mask.v_num = value_get_mask(f->desc.d_num);
+ mask_offset = emit_data(g, f->type, 0, &mask);
data_offset = emit_bitwise(g, f->type, BITWISE_AND,
NULL_OFFSET, offset,
mask_offset);
@@ -208,8 +209,12 @@ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
}
const_offset = emit_data(g, f->type, 0, &v);
+
emit_cmp(g, cmp, data_offset, const_offset,
gluten_size[f->type], jump);
+
+ emit_bpf_arg(index, f->type, v, mask, cmp);
+
break;
case GNU_DEV_MAJOR:
/*
@@ -219,7 +224,10 @@ ______________________ _____________
v.v_num = value_get_num(f->desc.d_num, jvalue);
v.v_num = (v.v_num & 0xfff) << 8 | (v.v_num & ~0xfff) << 32;
const_offset = emit_data(g, U64, 0, &v);
+
emit_cmp_field(g, cmp, f, offset, const_offset, jump);
+
+ filter_needs_deref(); /* No shifts in BPF */
break;
case GNU_DEV_MINOR:
/*
@@ -230,6 +238,8 @@ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
v.v_num = (v.v_num & 0xff) | (v.v_num & ~0xfff) << 12;
const_offset = emit_data(g, U64, 0, &v);
emit_cmp_field(g, cmp, f, offset, const_offset, jump);
+
+ filter_needs_deref(); /* No shifts in BPF */
break;
case SELECT:
f_inner = f->desc.d_select->field;
@@ -370,8 +380,9 @@ void handle_matches(struct gluten_ctx *g, JSON_Value *value)
emit_nr(g, emit_data(g, U64, 0, &v));
filter_notify(call->number);
-
parse_match(g, args, call->args);
+ filter_flush_args();
+
break;
}
call++;