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

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