diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2022-03-28 17:36:40 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2022-03-29 11:01:45 +0200 |
commit | 82762ab6f261226030debd5ffe4e22d987ebdb7b (patch) | |
tree | ed0d594178a3ceb2fd83ba0dabd364e9e7c1eefe /src/payload.c | |
parent | 64bb3f43bb96bb43a478f695f5aea5f4ab50fd4b (diff) |
src: allow to use integer type header fields via typeof set declaration
Header fields such as udp length cannot be used in concatenations because
it is using the generic integer_type:
test.nft:3:10-19: Error: can not use variable sized data types (integer) in concat expressions
typeof udp length . @th,32,32
^^^^^^^^^^~~~~~~~~~~~~
This patch slightly extends ("src: allow to use typeof of raw expressions in
set declaration") to set on NFTNL_UDATA_SET_KEY_PAYLOAD_LEN in userdata if
TYPE_INTEGER is used.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/payload.c')
-rw-r--r-- | src/payload.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/payload.c b/src/payload.c index fd6f7011..66418cdd 100644 --- a/src/payload.c +++ b/src/payload.c @@ -153,9 +153,9 @@ static int payload_expr_build_udata(struct nftnl_udata_buf *udbuf, expr->payload.base); nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET, expr->payload.offset); - nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_LEN, - expr->len); } + if (expr->dtype->type == TYPE_INTEGER) + nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEY_PAYLOAD_LEN, expr->len); return 0; } @@ -191,7 +191,7 @@ static int payload_parse_udata(const struct nftnl_udata *attr, void *data) static struct expr *payload_expr_parse_udata(const struct nftnl_udata *attr) { const struct nftnl_udata *ud[NFTNL_UDATA_SET_KEY_PAYLOAD_MAX + 1] = {}; - unsigned int type, base, offset, len; + unsigned int type, base, offset, len = 0; const struct proto_desc *desc; bool is_raw = false; struct expr *expr; @@ -209,20 +209,23 @@ static struct expr *payload_expr_parse_udata(const struct nftnl_udata *attr) desc = find_proto_desc(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_DESC]); if (!desc) { if (!ud[NFTNL_UDATA_SET_KEY_PAYLOAD_BASE] || - !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET] || - !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]) + !ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET]) return NULL; base = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_BASE]); offset = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_OFFSET]); - len = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]); is_raw = true; } type = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_TYPE]); + if (ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]) + len = nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_KEY_PAYLOAD_LEN]); expr = payload_expr_alloc(&internal_location, desc, type); + if (len) + expr->len = len; + if (is_raw) { struct datatype *dtype; |