|
|
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 |
|