Blame SOURCES/0022-netlink_delinearize-fix-decoding-of-concat-data-elem.patch

b59ec1
From b34a2b24c107a63183726333388e7946a36f2ea1 Mon Sep 17 00:00:00 2001
b59ec1
From: Phil Sutter <psutter@redhat.com>
b59ec1
Date: Fri, 17 Feb 2023 17:52:16 +0100
b59ec1
Subject: [PATCH] netlink_delinearize: fix decoding of concat data element
b59ec1
b59ec1
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094894
b59ec1
Upstream Status: nftables commit db59a5c1204c9
b59ec1
b59ec1
commit db59a5c1204c9246a82a115a8761f15809578479
b59ec1
Author: Florian Westphal <fw@strlen.de>
b59ec1
Date:   Mon Dec 12 11:04:34 2022 +0100
b59ec1
b59ec1
    netlink_delinearize: fix decoding of concat data element
b59ec1
b59ec1
    Its possible to use update as follows:
b59ec1
b59ec1
     meta l4proto tcp update @pinned { ip saddr . ct original proto-src : ip daddr . ct original proto-dst }
b59ec1
b59ec1
    ... but when listing, only the first element of the concatenation is
b59ec1
    shown.
b59ec1
b59ec1
    Check if the element size is too small and parse subsequent registers as
b59ec1
    well.
b59ec1
b59ec1
    Signed-off-by: Florian Westphal <fw@strlen.de>
b59ec1
b59ec1
Signed-off-by: Phil Sutter <psutter@redhat.com>
b59ec1
---
b59ec1
 src/netlink_delinearize.c | 8 ++++++++
b59ec1
 1 file changed, 8 insertions(+)
b59ec1
b59ec1
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
b59ec1
index 1d47c74..e9e0845 100644
b59ec1
--- a/src/netlink_delinearize.c
b59ec1
+++ b/src/netlink_delinearize.c
b59ec1
@@ -1659,6 +1659,14 @@ static void netlink_parse_dynset(struct netlink_parse_ctx *ctx,
b59ec1
 	if (nftnl_expr_is_set(nle, NFTNL_EXPR_DYNSET_SREG_DATA)) {
b59ec1
 		sreg_data = netlink_parse_register(nle, NFTNL_EXPR_DYNSET_SREG_DATA);
b59ec1
 		expr_data = netlink_get_register(ctx, loc, sreg_data);
b59ec1
+
b59ec1
+		if (expr_data->len < set->data->len) {
b59ec1
+			expr_free(expr_data);
b59ec1
+			expr_data = netlink_parse_concat_expr(ctx, loc, sreg_data, set->data->len);
b59ec1
+			if (expr_data == NULL)
b59ec1
+				netlink_error(ctx, loc,
b59ec1
+					      "Could not parse dynset map data expressions");
b59ec1
+		}
b59ec1
 	}
b59ec1
 
b59ec1
 	if (expr_data != NULL) {
b59ec1
-- 
b59ec1
2.39.2
b59ec1