Use AlmaLinux OS secure boot cert
Enable Btrfs support for all kernel variants
af_unix: set gc_in_progress to true in unix_gc() {CVE-2026-53361}
hpsa: bring back deprecated PCI ids #CFHack #CFHack2024
mptsas: bring back deprecated PCI ids #CFHack #CFHack2024
megaraid_sas: bring back deprecated PCI ids #CFHack #CFHack2024
qla2xxx: bring back deprecated PCI ids #CFHack #CFHack2024
qla4xxx: bring back deprecated PCI ids
be2iscsi: bring back deprecated PCI ids
kernel/rh_messages.h: enable all disabled pci devices by moving to unmaintained
gve: update QPL page registration logic to honor max_registered_pages (backport from upstream)
gve: enable reading max ring size from the device in DQO-QPL mode (backport from upstream)
149 lines
4.8 KiB
Diff
149 lines
4.8 KiB
Diff
From 0a7bf7be14b96c957f43956b2cec03faeee6a6c7 Mon Sep 17 00:00:00 2001
|
|
From: Florian Westphal <fwestpha@redhat.com>
|
|
Date: Wed, 13 May 2026 17:23:00 +0200
|
|
Subject: [PATCH] netfilter: nft_compat: run xt_check_hooks_{match,target}()
|
|
from .validate
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-168848
|
|
Upstream Status: commit 2f768d638d97
|
|
|
|
commit 2f768d638d977eff824f64dcc9639e3fea32da8f
|
|
Author: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
Date: Tue Apr 28 19:04:07 2026 +0200
|
|
|
|
netfilter: nft_compat: run xt_check_hooks_{match,target}() from .validate
|
|
|
|
Several matches and one target check that the hook is correct from
|
|
checkentry(), however, the basechain is only available from
|
|
nft_table_validate().
|
|
|
|
This patch uses xt_check_hooks_{match,target}() from the nft_compat
|
|
expression .validate path.
|
|
|
|
This patch sets the table in the nft_ctx struct in nft_table_validate()
|
|
which is required by this patch.
|
|
|
|
Based on patch from Florian Westphal.
|
|
|
|
Fixes: 0ca743a55991 ("netfilter: nf_tables: add compatibility layer for x_tables")
|
|
Reported-by: Xiang Mei <xmei5@asu.edu>
|
|
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
|
|
Signed-off-by: Florian Westphal <fwestpha@redhat.com>
|
|
|
|
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
|
|
index 32155f1..188a621 100644
|
|
--- a/net/netfilter/nf_tables_api.c
|
|
+++ b/net/netfilter/nf_tables_api.c
|
|
@@ -4185,6 +4185,7 @@ static int nft_table_validate(struct net *net, const struct nft_table *table)
|
|
struct nft_chain *chain;
|
|
struct nft_ctx ctx = {
|
|
.net = net,
|
|
+ .table = (struct nft_table *)table,
|
|
.family = table->family,
|
|
};
|
|
int err = 0;
|
|
diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c
|
|
index 72711d6..c58a93d 100644
|
|
--- a/net/netfilter/nft_compat.c
|
|
+++ b/net/netfilter/nft_compat.c
|
|
@@ -260,10 +260,10 @@ nft_target_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
|
|
return ret;
|
|
}
|
|
|
|
- nft_target_set_tgchk_param(&par, ctx, target, info, &e, proto, inv);
|
|
-
|
|
nft_compat_wait_for_destructors(ctx->net);
|
|
|
|
+ nft_target_set_tgchk_param(&par, ctx, target, info, &e, proto, inv);
|
|
+
|
|
ret = xt_check_target(&par, size, proto, inv);
|
|
if (ret < 0) {
|
|
if (ret == -ENOENT) {
|
|
@@ -352,8 +352,6 @@ static int nft_target_dump(struct sk_buff *skb,
|
|
static int nft_target_validate(const struct nft_ctx *ctx,
|
|
const struct nft_expr *expr)
|
|
{
|
|
- struct xt_target *target = expr->ops->data;
|
|
- unsigned int hook_mask = 0;
|
|
int ret;
|
|
|
|
if (ctx->family != NFPROTO_IPV4 &&
|
|
@@ -376,11 +374,21 @@ static int nft_target_validate(const struct nft_ctx *ctx,
|
|
const struct nft_base_chain *basechain =
|
|
nft_base_chain(ctx->chain);
|
|
const struct nf_hook_ops *ops = &basechain->ops;
|
|
+ unsigned int hook_mask = 1 << ops->hooknum;
|
|
+ struct xt_target *target = expr->ops->data;
|
|
+ void *info = nft_expr_priv(expr);
|
|
+ struct xt_tgchk_param par;
|
|
+ union nft_entry e = {};
|
|
|
|
- hook_mask = 1 << ops->hooknum;
|
|
if (target->hooks && !(hook_mask & target->hooks))
|
|
return -EINVAL;
|
|
|
|
+ nft_target_set_tgchk_param(&par, ctx, target, info, &e, 0, false);
|
|
+
|
|
+ ret = xt_check_hooks_target(&par);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+
|
|
ret = nft_compat_chain_validate_dependency(ctx, target->table);
|
|
if (ret < 0)
|
|
return ret;
|
|
@@ -513,10 +521,10 @@ __nft_match_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
|
|
return ret;
|
|
}
|
|
|
|
- nft_match_set_mtchk_param(&par, ctx, match, info, &e, proto, inv);
|
|
-
|
|
nft_compat_wait_for_destructors(ctx->net);
|
|
|
|
+ nft_match_set_mtchk_param(&par, ctx, match, info, &e, proto, inv);
|
|
+
|
|
return xt_check_match(&par, size, proto, inv);
|
|
}
|
|
|
|
@@ -612,8 +620,6 @@ static int nft_match_large_dump(struct sk_buff *skb,
|
|
static int nft_match_validate(const struct nft_ctx *ctx,
|
|
const struct nft_expr *expr)
|
|
{
|
|
- struct xt_match *match = expr->ops->data;
|
|
- unsigned int hook_mask = 0;
|
|
int ret;
|
|
|
|
if (ctx->family != NFPROTO_IPV4 &&
|
|
@@ -636,11 +642,30 @@ static int nft_match_validate(const struct nft_ctx *ctx,
|
|
const struct nft_base_chain *basechain =
|
|
nft_base_chain(ctx->chain);
|
|
const struct nf_hook_ops *ops = &basechain->ops;
|
|
+ unsigned int hook_mask = 1 << ops->hooknum;
|
|
+ struct xt_match *match = expr->ops->data;
|
|
+ size_t size = XT_ALIGN(match->matchsize);
|
|
+ struct xt_mtchk_param par;
|
|
+ union nft_entry e = {};
|
|
+ void *info;
|
|
|
|
- hook_mask = 1 << ops->hooknum;
|
|
if (match->hooks && !(hook_mask & match->hooks))
|
|
return -EINVAL;
|
|
|
|
+ if (NFT_EXPR_SIZE(size) > NFT_MATCH_LARGE_THRESH) {
|
|
+ struct nft_xt_match_priv *priv = nft_expr_priv(expr);
|
|
+
|
|
+ info = priv->info;
|
|
+ } else {
|
|
+ info = nft_expr_priv(expr);
|
|
+ }
|
|
+
|
|
+ nft_match_set_mtchk_param(&par, ctx, match, info, &e, 0, false);
|
|
+
|
|
+ ret = xt_check_hooks_match(&par);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+
|
|
ret = nft_compat_chain_validate_dependency(ctx, match->table);
|
|
if (ret < 0)
|
|
return ret;
|