diff options
author | Florian Westphal <fw@strlen.de> | 2022-12-12 11:04:34 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2022-12-12 16:50:00 +0100 |
commit | db59a5c1204c9246a82a115a8761f15809578479 (patch) | |
tree | 280a67d5faedef378a41b132f10295ad4fb8e6a5 /src/netlink_delinearize.c | |
parent | afd3b826fea47f512513bdb359c947c64fb59f0d (diff) |
netlink_delinearize: fix decoding of concat data element
Its possible to use update as follows:
meta l4proto tcp update @pinned { ip saddr . ct original proto-src : ip daddr . ct original proto-dst }
... but when listing, only the first element of the concatenation is
shown.
Check if the element size is too small and parse subsequent registers as
well.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src/netlink_delinearize.c')
-rw-r--r-- | src/netlink_delinearize.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index 0b6cf107..fe3246b2 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -1660,6 +1660,14 @@ static void netlink_parse_dynset(struct netlink_parse_ctx *ctx, if (nftnl_expr_is_set(nle, NFTNL_EXPR_DYNSET_SREG_DATA)) { sreg_data = netlink_parse_register(nle, NFTNL_EXPR_DYNSET_SREG_DATA); expr_data = netlink_get_register(ctx, loc, sreg_data); + + if (expr_data->len < set->data->len) { + expr_free(expr_data); + expr_data = netlink_parse_concat_expr(ctx, loc, sreg_data, set->data->len); + if (expr_data == NULL) + netlink_error(ctx, loc, + "Could not parse dynset map data expressions"); + } } if (expr_data != NULL) { |