summaryrefslogtreecommitdiffstats
path: root/src/payload.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2022-03-28 17:36:40 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2022-03-29 11:01:45 +0200
commit82762ab6f261226030debd5ffe4e22d987ebdb7b (patch)
treeed0d594178a3ceb2fd83ba0dabd364e9e7c1eefe /src/payload.c
parent64bb3f43bb96bb43a478f695f5aea5f4ab50fd4b (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.c15
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;