Blame SOURCES/0069-monitor-Do-not-decompose-non-anonymous-sets.patch

cc550a
From 7859b19a1e8307b5bee6ca71261dd0bc06fda6f2 Mon Sep 17 00:00:00 2001
cc550a
From: Phil Sutter <phil@nwl.cc>
cc550a
Date: Thu, 9 Jan 2020 13:34:20 +0100
cc550a
Subject: [PATCH] monitor: Do not decompose non-anonymous sets
cc550a
cc550a
They have been decomposed already, trying to do that again causes a
cc550a
segfault. This is a similar fix as in commit 8ecb885589591 ("src:
cc550a
restore --echo with anonymous sets").
cc550a
cc550a
Signed-off-by: Phil Sutter <phil@nwl.cc>
cc550a
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
cc550a
(cherry picked from commit 5d57fa3e99bb9f2044e236d4ddb7d874cfefe1dd)
cc550a
Signed-off-by: Phil Sutter <psutter@redhat.com>
cc550a
---
cc550a
 src/monitor.c                          |  2 +-
cc550a
 tests/monitor/testcases/set-interval.t | 20 ++++++++++++++++++++
cc550a
 2 files changed, 21 insertions(+), 1 deletion(-)
cc550a
 create mode 100644 tests/monitor/testcases/set-interval.t
cc550a
cc550a
diff --git a/src/monitor.c b/src/monitor.c
cc550a
index 14ccbc5fe04ca..ba8e11888a215 100644
cc550a
--- a/src/monitor.c
cc550a
+++ b/src/monitor.c
cc550a
@@ -500,7 +500,7 @@ static int netlink_events_obj_cb(const struct nlmsghdr *nlh, int type,
cc550a
 
cc550a
 static void rule_map_decompose_cb(struct set *s, void *data)
cc550a
 {
cc550a
-	if (s->flags & NFT_SET_INTERVAL)
cc550a
+	if (s->flags & (NFT_SET_INTERVAL & NFT_SET_ANONYMOUS))
cc550a
 		interval_map_decompose(s->init);
cc550a
 }
cc550a
 
cc550a
diff --git a/tests/monitor/testcases/set-interval.t b/tests/monitor/testcases/set-interval.t
cc550a
new file mode 100644
cc550a
index 0000000000000..59930c58243d8
cc550a
--- /dev/null
cc550a
+++ b/tests/monitor/testcases/set-interval.t
cc550a
@@ -0,0 +1,20 @@
cc550a
+# setup first
cc550a
+I add table ip t
cc550a
+I add chain ip t c
cc550a
+O -
cc550a
+J {"add": {"table": {"family": "ip", "name": "t", "handle": 0}}}
cc550a
+J {"add": {"chain": {"family": "ip", "table": "t", "name": "c", "handle": 0}}}
cc550a
+
cc550a
+# add set with elements, monitor output expectedly differs
cc550a
+I add set ip t s { type inet_service; flags interval; elements = { 20, 30-40 }; }
cc550a
+O add set ip t s { type inet_service; flags interval; }
cc550a
+O add element ip t s { 20 }
cc550a
+O add element ip t s { 30-40 }
cc550a
+J {"add": {"set": {"family": "ip", "name": "s", "table": "t", "type": "inet_service", "handle": 0, "flags": ["interval"]}}}
cc550a
+J {"add": {"element": {"family": "ip", "table": "t", "name": "s", "elem": {"set": [20]}}}}
cc550a
+J {"add": {"element": {"family": "ip", "table": "t", "name": "s", "elem": {"set": [{"range": [30, 40]}]}}}}
cc550a
+
cc550a
+# this would crash nft
cc550a
+I add rule ip t c tcp dport @s
cc550a
+O -
cc550a
+J {"add": {"rule": {"family": "ip", "table": "t", "chain": "c", "handle": 0, "expr": [{"match": {"op": "==", "left": {"payload": {"protocol": "tcp", "field": "dport"}}, "right": "@s"}}]}}}
cc550a
-- 
cc550a
2.24.1
cc550a