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

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