Blame SOURCES/0008-segtree-disantangle-get_set_interval_end.patch

9ff721
From 40edcc35cbfca22d4cb471464eacc12cf7c5c28a Mon Sep 17 00:00:00 2001
9ff721
From: Pablo Neira Ayuso <pablo@netfilter.org>
9ff721
Date: Wed, 3 Oct 2018 12:09:09 +0200
9ff721
Subject: [PATCH] segtree: disantangle get_set_interval_end()
9ff721
9ff721
This function overrides the left pointer. Instead update this function
9ff721
to return the range that we found to enclose the left element. Note that
9ff721
we may not find a closing right element - therefore, it is a standalone
9ff721
element - in that case this function returns NULL.
9ff721
9ff721
Reported-by: Phil Sutter <phil@nwl.cc>
9ff721
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
9ff721
(cherry picked from commit 33eb4594a1c764776a46b48bc1a7d726b561359d)
9ff721
Signed-off-by: Phil Sutter <psutter@redhat.com>
9ff721
---
9ff721
 src/segtree.c | 37 ++++++++++++++++++++++---------------
9ff721
 1 file changed, 22 insertions(+), 15 deletions(-)
9ff721
9ff721
diff --git a/src/segtree.c b/src/segtree.c
9ff721
index 288b01f420a48..0d53c83fd837e 100644
9ff721
--- a/src/segtree.c
9ff721
+++ b/src/segtree.c
9ff721
@@ -681,9 +681,9 @@ static struct expr *get_set_interval_end(const struct table *table,
9ff721
 					 const char *set_name,
9ff721
 					 struct expr *left)
9ff721
 {
9ff721
+	struct expr *i, *range = NULL;
9ff721
 	struct set *set;
9ff721
 	mpz_t low, high;
9ff721
-	struct expr *i;
9ff721
 
9ff721
 	set = set_lookup(table, set_name);
9ff721
 	mpz_init2(low, set->key->len);
9ff721
@@ -694,9 +694,9 @@ static struct expr *get_set_interval_end(const struct table *table,
9ff721
 		case EXPR_RANGE:
9ff721
 			range_expr_value_low(low, i);
9ff721
 			if (mpz_cmp(low, left->key->value) == 0) {
9ff721
-				left = range_expr_alloc(&internal_location,
9ff721
-							expr_clone(left->key),
9ff721
-							expr_clone(i->key->right));
9ff721
+				range = range_expr_alloc(&internal_location,
9ff721
+							 expr_clone(left->key),
9ff721
+							 expr_clone(i->key->right));
9ff721
 				break;
9ff721
 			}
9ff721
 			break;
9ff721
@@ -708,12 +708,12 @@ static struct expr *get_set_interval_end(const struct table *table,
9ff721
 	mpz_clear(low);
9ff721
 	mpz_clear(high);
9ff721
 
9ff721
-	return left;
9ff721
+	return range;
9ff721
 }
9ff721
 
9ff721
 int get_set_decompose(struct table *table, struct set *set)
9ff721
 {
9ff721
-	struct expr *i, *next, *new;
9ff721
+	struct expr *i, *next, *range;
9ff721
 	struct expr *left = NULL;
9ff721
 	struct expr *new_init;
9ff721
 
9ff721
@@ -724,28 +724,35 @@ int get_set_decompose(struct table *table, struct set *set)
9ff721
 			list_del(&left->list);
9ff721
 			list_del(&i->list);
9ff721
 			mpz_sub_ui(i->key->value, i->key->value, 1);
9ff721
-			new = get_set_interval_find(table, set->handle.set.name,
9ff721
+			range = get_set_interval_find(table, set->handle.set.name,
9ff721
 						    left, i);
9ff721
-			if (!new) {
9ff721
+			if (!range) {
9ff721
 				errno = ENOENT;
9ff721
 				return -1;
9ff721
 			}
9ff721
 
9ff721
-			compound_expr_add(new_init, new);
9ff721
+			compound_expr_add(new_init, range);
9ff721
 			left = NULL;
9ff721
 		} else {
9ff721
 			if (left) {
9ff721
-				left = get_set_interval_end(table,
9ff721
-							    set->handle.set.name,
9ff721
-							    left);
9ff721
-				compound_expr_add(new_init, left);
9ff721
+				range = get_set_interval_end(table,
9ff721
+							     set->handle.set.name,
9ff721
+							     left);
9ff721
+				if (range)
9ff721
+					compound_expr_add(new_init, range);
9ff721
+				else
9ff721
+					compound_expr_add(new_init,
9ff721
+							  expr_clone(left));
9ff721
 			}
9ff721
 			left = i;
9ff721
 		}
9ff721
 	}
9ff721
 	if (left) {
9ff721
-		left = get_set_interval_end(table, set->handle.set.name, left);
9ff721
-		compound_expr_add(new_init, left);
9ff721
+		range = get_set_interval_end(table, set->handle.set.name, left);
9ff721
+		if (range)
9ff721
+			compound_expr_add(new_init, left);
9ff721
+		else
9ff721
+			compound_expr_add(new_init, expr_clone(left));
9ff721
 	}
9ff721
 
9ff721
 	set->init = new_init;
9ff721
-- 
bacbc8
2.21.0
9ff721