summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2021-03-17 00:44:09 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2021-03-24 13:40:37 +0100
commitcd54a9bb2da0686ad3684741f3b8f6696639013f (patch)
tree3a36473fd395712c97e6f79f3e901d61d50f7c7a
parent47fdff19c0e1aba85cc0edf74fa029d4ed4f10e7 (diff)
segtree: release single element already contained in an interval
Before this patch: table ip x { chain y { ip saddr { 1.1.1.1-1.1.1.2, 1.1.1.1 } } } results in: table ip x { chain y { ip saddr { 1.1.1.1 } } } due to incorrect interval merge logic. If the element 1.1.1.1 is already contained in an existing interval 1.1.1.1-1.1.1.2, release it. Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1512 Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/segtree.c8
-rwxr-xr-xtests/shell/testcases/sets/0061anonymous_automerge_011
-rw-r--r--tests/shell/testcases/sets/dumps/0061anonymous_automerge_0.nft5
3 files changed, 23 insertions, 1 deletions
diff --git a/src/segtree.c b/src/segtree.c
index 9aa39e52..ad199355 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -210,6 +210,12 @@ static int ei_insert(struct list_head *msgs, struct seg_tree *tree,
ei = lei;
goto err;
}
+ /* single element contained in an existing interval */
+ if (mpz_cmp(new->left, new->right) == 0) {
+ ei_destroy(new);
+ goto out;
+ }
+
/*
* The new interval is entirely contained in the same interval,
* split it into two parts:
@@ -277,7 +283,7 @@ static int ei_insert(struct list_head *msgs, struct seg_tree *tree,
}
__ei_insert(tree, new);
-
+out:
mpz_clear(p);
return 0;
diff --git a/tests/shell/testcases/sets/0061anonymous_automerge_0 b/tests/shell/testcases/sets/0061anonymous_automerge_0
new file mode 100755
index 00000000..2dfb800e
--- /dev/null
+++ b/tests/shell/testcases/sets/0061anonymous_automerge_0
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+
+RULESET="table ip x {
+ chain y {
+ ip saddr { 1.1.1.1-1.1.1.2, 1.1.1.1 }
+ }
+}"
+
+$NFT -f - <<< $RULESET
diff --git a/tests/shell/testcases/sets/dumps/0061anonymous_automerge_0.nft b/tests/shell/testcases/sets/dumps/0061anonymous_automerge_0.nft
new file mode 100644
index 00000000..04361f4c
--- /dev/null
+++ b/tests/shell/testcases/sets/dumps/0061anonymous_automerge_0.nft
@@ -0,0 +1,5 @@
+table ip x {
+ chain y {
+ ip saddr { 1.1.1.1-1.1.1.2 }
+ }
+}