nftables/SOURCES/0297-segtree-fix-get-element-command-with-open-intervals.patch
2026-08-26 08:03:54 -04:00

68 lines
2.3 KiB
Diff

From 95c0f26b24f3a09ca1bd09cbd395670329721de8 Mon Sep 17 00:00:00 2001
From: Phil Sutter <psutter@redhat.com>
Date: Fri, 17 Jul 2026 11:20:22 +0200
Subject: [PATCH] segtree: fix get element command with open intervals
JIRA: https://issues.redhat.com/browse/RHEL-190549
Upstream Status: nftables commit 4eafc1a2a9ef5a827b1b4e58cb3b2832d2eb1650
commit 4eafc1a2a9ef5a827b1b4e58cb3b2832d2eb1650
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Thu Jul 2 11:57:00 2026 +0200
segtree: fix get element command with open intervals
Skip the closing end element in case this is an open interval.
Otherwise, a bogus end element max(type) + 1 is provided, eg. in
inet_service, this results as a 0x10000 with end interval flag
which is interpreted by the kernel as a matching closing element.
Fixes: a43cc8d53096 ("src: support for get element command")
Reported-by: Melbin K Mathew <mlbnkm1@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Phil Sutter <psutter@redhat.com>
---
src/segtree.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/segtree.c b/src/segtree.c
index 2ad3db7..c659dbf 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -70,12 +70,13 @@ static void set_elem_expr_add(const struct set *set, struct expr *init,
struct expr *get_set_intervals(const struct set *set, const struct expr *init)
{
enum byteorder byteorder = get_key_byteorder(set->key);
+ mpz_t low, high, mask;
struct expr *new_init;
- mpz_t low, high;
struct expr *i;
mpz_init2(low, set->key->len);
mpz_init2(high, set->key->len);
+ mpz_init2(mask, set->key->len);
new_init = list_expr_alloc(&internal_location);
@@ -100,6 +101,11 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init)
range_expr_value_low(low, i->key);
set_elem_expr_add(set, new_init, low, 0, i->byteorder);
range_expr_value_high(high, i->key);
+ mpz_bitmask(mask, i->len);
+ if (set_is_non_concat_range(set) &&
+ !mpz_cmp(mask, high))
+ break;
+
mpz_add_ui(high, high, 1);
set_elem_expr_add(set, new_init, high,
EXPR_F_INTERVAL_END, i->byteorder);
@@ -110,6 +116,7 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init)
}
}
+ mpz_clear(mask);
mpz_clear(low);
mpz_clear(high);