Blame SOURCES/0071-libxtables-Register-only-the-highest-revision-extens.patch

d8275f
From afcbce6924dfe05af4b41bf46b21794f4a4d8302 Mon Sep 17 00:00:00 2001
d8275f
From: Phil Sutter <phil@nwl.cc>
d8275f
Date: Fri, 11 Feb 2022 17:39:24 +0100
d8275f
Subject: [PATCH] libxtables: Register only the highest revision extension
d8275f
d8275f
When fully registering extensions, ignore all consecutive ones with same
d8275f
name and family value. Since commit b3ac87038f4e4 ("libxtables: Make
d8275f
sure extensions register in revision order"), one may safely assume the
d8275f
list of pending extensions has highest revision numbers first. Since
d8275f
iptables is only interested in the highest revision the kernel supports,
d8275f
registration and compatibility checks may be skipped once the first
d8275f
matching extension in pending list has validated.
d8275f
d8275f
Signed-off-by: Phil Sutter <phil@nwl.cc>
d8275f
(cherry picked from commit 2dbb49d15fb44ddd521a734eca3be3f940b7c1ba)
d8275f
---
d8275f
 libxtables/xtables.c | 10 ++++++++--
d8275f
 1 file changed, 8 insertions(+), 2 deletions(-)
d8275f
d8275f
diff --git a/libxtables/xtables.c b/libxtables/xtables.c
d8275f
index 4aee74acb6816..57ad0330a454c 100644
d8275f
--- a/libxtables/xtables.c
d8275f
+++ b/libxtables/xtables.c
d8275f
@@ -701,6 +701,7 @@ xtables_find_match(const char *name, enum xtables_tryload tryload,
d8275f
 	struct xtables_match **dptr;
d8275f
 	struct xtables_match *ptr;
d8275f
 	const char *icmp6 = "icmp6";
d8275f
+	bool found = false;
d8275f
 
d8275f
 	if (strlen(name) >= XT_EXTENSION_MAXNAMELEN)
d8275f
 		xtables_error(PARAMETER_PROBLEM,
d8275f
@@ -719,7 +720,9 @@ xtables_find_match(const char *name, enum xtables_tryload tryload,
d8275f
 		if (extension_cmp(name, (*dptr)->name, (*dptr)->family)) {
d8275f
 			ptr = *dptr;
d8275f
 			*dptr = (*dptr)->next;
d8275f
-			if (xtables_fully_register_pending_match(ptr, prev)) {
d8275f
+			if (!found &&
d8275f
+			    xtables_fully_register_pending_match(ptr, prev)) {
d8275f
+				found = true;
d8275f
 				prev = ptr;
d8275f
 				continue;
d8275f
 			} else if (prev) {
d8275f
@@ -821,6 +824,7 @@ xtables_find_target(const char *name, enum xtables_tryload tryload)
d8275f
 	struct xtables_target *prev = NULL;
d8275f
 	struct xtables_target **dptr;
d8275f
 	struct xtables_target *ptr;
d8275f
+	bool found = false;
d8275f
 
d8275f
 	/* Standard target? */
d8275f
 	if (strcmp(name, "") == 0
d8275f
@@ -839,7 +843,9 @@ xtables_find_target(const char *name, enum xtables_tryload tryload)
d8275f
 		if (extension_cmp(name, (*dptr)->name, (*dptr)->family)) {
d8275f
 			ptr = *dptr;
d8275f
 			*dptr = (*dptr)->next;
d8275f
-			if (xtables_fully_register_pending_target(ptr, prev)) {
d8275f
+			if (!found &&
d8275f
+			    xtables_fully_register_pending_target(ptr, prev)) {
d8275f
+				found = true;
d8275f
 				prev = ptr;
d8275f
 				continue;
d8275f
 			} else if (prev) {
d8275f
-- 
d8275f
2.34.1
d8275f