FAILED: patch "[PATCH] netfilter: ebtables: zero chainstack array" failed to apply to 6.6-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x cbfe53599eebffd188938ab6774cc41794f6f9d5
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026071335-exemplify-sheet-ddd5@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From cbfe53599eebffd188938ab6774cc41794f6f9d5 Mon Sep 17 00:00:00 2001
From: Florian Westphal <[email protected]>
Date: Sat, 4 Jul 2026 10:23:31 +0200
Subject: [PATCH] netfilter: ebtables: zero chainstack array
sashiko reports:
looking at ebtables table
translation, could a sparse cpu_possible_mask lead to an uninitialized pointer free?
If cpu_possible_mask is sparse (for example, CPU 0 and CPU 2 are possible, but CPU 1 is not), the allocation loop skips CPU 1. If vmalloc_node() fails at CPU 2, the cleanup loop will blindly decrement and call vfree() on newinfo->chainstack[1].
Not a real-world bug, such allocation isn't expected to fail in the first place.
net/bridge/netfilter/ebtables.c +1 -2
@@ -921,8 +921,7 @@ static int translate_table(struct net *net, const char *name,* if an error occurs */ newinfo->chainstack = -vmalloc_array (nr_cpu_ids, -sizeof (*(newinfo->chainstack))); +vcalloc (nr_cpu_ids,sizeof (*(newinfo->chainstack)));if (!newinfo->chainstack)return -ENOMEM ;for_each_possible_cpu (i) {
Sasha Levin
maintainerPATCH 1/2 netfilter: ebtables: Use vmalloc_array() to improve code
From: Qianfeng Rong <[email protected]>
[ Upstream commit 46015e6b3ea75297b28d4806564f3f692cf11861 ]
Remove array_size() calls and replace vmalloc() with vmalloc_array() to simplify the code. vmalloc_array() is also optimized better, uses fewer instructions, and handles overflow more concisely[1].
[1]: https://lore.kernel.org/lkml/[email protected]/
Stable-dep-of: cbfe53599eeb ("netfilter: ebtables: zero chainstack array")
--- net/bridge/netfilter/ebtables.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/bridge/netfilter/ebtables.c +7 -7
@@ -920,8 +920,8 @@ static int translate_table(struct net *net, const char *name,* if an error occurs */ newinfo->chainstack = -vmalloc (array_size (nr_cpu_ids, -sizeof (*(newinfo->chainstack)))); +vmalloc_array (nr_cpu_ids, +sizeof (*(newinfo->chainstack)));if (!newinfo->chainstack)return -ENOMEM ;for_each_possible_cpu (i) {
@@ -938,7 +938,7 @@ static int translate_table(struct net *net, const char *name, } } - cl_s =vmalloc (array_size (udc_cnt,sizeof (*cl_s))); + cl_s =vmalloc_array (udc_cnt,sizeof (*cl_s));if (!cl_s)return -ENOMEM ; i =0 ;/* the i'th udc */
@@ -1018,8 +1018,8 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl,* the check on the size is done later, when we have the lock */ if (repl->num_counters) { -unsigned long size = repl->num_counters *sizeof (*counterstmp); - counterstmp =vmalloc (size); + counterstmp =vmalloc_array (repl->num_counters, +sizeof (*counterstmp));if (!counterstmp)return -ENOMEM ; }
@@ -1386,7 +1386,7 @@ static int do_update_counters(struct net *net, const char *name,if (num_counters ==0 )return -EINVAL ; - tmp =vmalloc (array_size (num_counters,sizeof (*tmp))); + tmp =vmalloc_array (num_counters,sizeof (*tmp));if (!tmp)return -ENOMEM ;
@@ -1526,7 +1526,7 @@ static int copy_counters_to_user(struct ebt_table *t,if (num_counters != nentries)return -EINVAL ; - counterstmp =vmalloc (array_size (nentries,sizeof (*counterstmp))); + counterstmp =vmalloc_array (nentries,sizeof (*counterstmp));if (!counterstmp)return -ENOMEM ;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 netfilter: ebtables: zero chainstack array
From: Florian Westphal <[email protected]>
[ Upstream commit cbfe53599eebffd188938ab6774cc41794f6f9d5 ]
sashiko reports:
looking at ebtables table
translation, could a sparse cpu_possible_mask lead to an uninitialized pointer free?
If cpu_possible_mask is sparse (for example, CPU 0 and CPU 2 are possible, but CPU 1 is not), the allocation loop skips CPU 1. If vmalloc_node() fails at CPU 2, the cleanup loop will blindly decrement and call vfree() on newinfo->chainstack[1].
Not a real-world bug, such allocation isn't expected to fail in the first place.
--- net/bridge/netfilter/ebtables.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/bridge/netfilter/ebtables.c +1 -2
@@ -920,8 +920,7 @@ static int translate_table(struct net *net, const char *name,* if an error occurs */ newinfo->chainstack = -vmalloc_array (nr_cpu_ids, -sizeof (*(newinfo->chainstack))); +vcalloc (nr_cpu_ids,sizeof (*(newinfo->chainstack)));if (!newinfo->chainstack)return -ENOMEM ;for_each_possible_cpu (i) {
Signature · 1 line
2.53.0