mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 09:00:12 +00:00
netfilter pull request nf-26-01-02
-----BEGIN PGP SIGNATURE----- iQJdBAABCABHFiEEgKkgxbID4Gn1hq6fcJGo2a1f9gAFAmlXqEwbFIAAAAAABAAO bWFudTIsMi41KzEuMTEsMiwyDRxmd0BzdHJsZW4uZGUACgkQcJGo2a1f9gBFeg// awoFVzkRjgk5RgGnZstWU5QIDRwdl6G+Q0OkuQSh3KNQak50CxbrY6X6zSdVSJjG y///iM1zONM46k0TIvYovHklYp4adTTEPEXISuUwzARfbD6X40qgsVCkBNrmr5fO l1cu2RXAcYzNOm9DrC+744z8KVeduoL6LFon0Xf4ah/eqxM7o92Tcj8dtPV1TsA8 8C+wVxZIw11OaM7H1fKhUMhQ6CnVc5OZOveO/lJxonaTIuCVULxPezEZQjpXNcnc hp5uMrip2BlecyeNFiPqDhqnVeU34xN3Zxns6Nq9zOcz5yfQg/LB/XGTx39HVljn 4v7ziGS+7qUQ9zc9LNID1jgJY6RNlj2+SkbavTfKpPQagKOR+BEIw7b4KBAsOL9l b8uDXLlUaWKTjb/DIVSWks5viwg1tbtsdyoeplcHWfP7miATp59es2FvD+DxT8HV stXhTWf0CDCLxiUHW9E8+QoQcnktjw9khoCZY/YZwfbIYf60uvlLEzO2G1Dt9SO6 cYfdlHLPpFcmQKhEOAFuOSRURqpyMHpwRgbul1yvR/ItW0hNA8j4oepo6g6crU+l WQ+l18ZtV0Aa/CxZ4eGcUBvonjf/n+XR8Hshukh9yRblF5BFDuSFIKWY7pMbkRO2 Es+C4Q6WMufRmovYhWqUaR4pHJFFSVe7JxBZ85VBVjI= =g2yW -----END PGP SIGNATURE----- Merge tag 'nf-26-01-02' of https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf Florian Westphal says: ==================== netfilter: updates for net The following patchset contains Netfilter fixes for *net*: 1) Fix overlap detection for nf_tables with concatenated ranges. There are cases where element could not be added due to a conflict with existing range, while kernel reports success to userspace. 2) update selftest to cover this bug. 3) synproxy update path should use READ/WRITE once as we replace config struct while packet path might read it in parallel. This relies on said config struct to fit sizeof(long). From Fernando Fernandez Mancera. 4) Don't return -EEXIST from xtables in module load path, a pending patch to module infra will spot a warning if this happens. From Daniel Gomez. 5) Fix a memory leak in nf_tables when chain hits 2**32 users and rule is to be hw-offloaded, from Zilin Guan. 6) Avoid infinite list growth when insert rate is high in nf_conncount, also from Fernando. * tag 'nf-26-01-02' of https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf: netfilter: nf_conncount: update last_gc only when GC has been performed netfilter: nf_tables: fix memory leak in nf_tables_newrule() netfilter: replace -EEXIST with -EBUSY netfilter: nft_synproxy: avoid possible data-race on update operation selftests: netfilter: nft_concat_range.sh: add check for overlap detection bug netfilter: nft_set_pipapo: fix range overlap detection ==================== Link: https://patch.msgid.link/20260102114128.7007-1-fw@strlen.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
d6f6c6d909
@ -1299,7 +1299,7 @@ int ebt_register_template(const struct ebt_table *t, int (*table_init)(struct ne
|
||||
list_for_each_entry(tmpl, &template_tables, list) {
|
||||
if (WARN_ON_ONCE(strcmp(t->name, tmpl->name) == 0)) {
|
||||
mutex_unlock(&ebt_mutex);
|
||||
return -EEXIST;
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -229,6 +229,7 @@ static int __nf_conncount_add(struct net *net,
|
||||
|
||||
nf_ct_put(found_ct);
|
||||
}
|
||||
list->last_gc = (u32)jiffies;
|
||||
|
||||
add_new_node:
|
||||
if (WARN_ON_ONCE(list->count > INT_MAX)) {
|
||||
@ -248,7 +249,6 @@ add_new_node:
|
||||
conn->jiffies32 = (u32)jiffies;
|
||||
list_add_tail(&conn->node, &list->head);
|
||||
list->count++;
|
||||
list->last_gc = (u32)jiffies;
|
||||
|
||||
out_put:
|
||||
if (refcounted)
|
||||
|
||||
@ -89,7 +89,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)
|
||||
if (pf == NFPROTO_UNSPEC) {
|
||||
for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++) {
|
||||
if (rcu_access_pointer(loggers[i][logger->type])) {
|
||||
ret = -EEXIST;
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
@ -97,7 +97,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)
|
||||
rcu_assign_pointer(loggers[i][logger->type], logger);
|
||||
} else {
|
||||
if (rcu_access_pointer(loggers[pf][logger->type])) {
|
||||
ret = -EEXIST;
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
rcu_assign_pointer(loggers[pf][logger->type], logger);
|
||||
|
||||
@ -4439,7 +4439,7 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
|
||||
if (!nft_use_inc(&chain->use)) {
|
||||
err = -EMFILE;
|
||||
goto err_release_rule;
|
||||
goto err_destroy_flow;
|
||||
}
|
||||
|
||||
if (info->nlh->nlmsg_flags & NLM_F_REPLACE) {
|
||||
@ -4489,6 +4489,7 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
|
||||
err_destroy_flow_rule:
|
||||
nft_use_dec_restore(&chain->use);
|
||||
err_destroy_flow:
|
||||
if (flow)
|
||||
nft_flow_rule_destroy(flow);
|
||||
err_release_rule:
|
||||
|
||||
@ -1317,8 +1317,8 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
|
||||
else
|
||||
dup_end = dup_key;
|
||||
|
||||
if (!memcmp(start, dup_key->data, sizeof(*dup_key->data)) &&
|
||||
!memcmp(end, dup_end->data, sizeof(*dup_end->data))) {
|
||||
if (!memcmp(start, dup_key->data, set->klen) &&
|
||||
!memcmp(end, dup_end->data, set->klen)) {
|
||||
*elem_priv = &dup->priv;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ static void nft_synproxy_eval_v4(const struct nft_synproxy *priv,
|
||||
struct tcphdr *_tcph,
|
||||
struct synproxy_options *opts)
|
||||
{
|
||||
struct nf_synproxy_info info = priv->info;
|
||||
struct nf_synproxy_info info = READ_ONCE(priv->info);
|
||||
struct net *net = nft_net(pkt);
|
||||
struct synproxy_net *snet = synproxy_pernet(net);
|
||||
struct sk_buff *skb = pkt->skb;
|
||||
@ -79,7 +79,7 @@ static void nft_synproxy_eval_v6(const struct nft_synproxy *priv,
|
||||
struct tcphdr *_tcph,
|
||||
struct synproxy_options *opts)
|
||||
{
|
||||
struct nf_synproxy_info info = priv->info;
|
||||
struct nf_synproxy_info info = READ_ONCE(priv->info);
|
||||
struct net *net = nft_net(pkt);
|
||||
struct synproxy_net *snet = synproxy_pernet(net);
|
||||
struct sk_buff *skb = pkt->skb;
|
||||
@ -340,7 +340,7 @@ static void nft_synproxy_obj_update(struct nft_object *obj,
|
||||
struct nft_synproxy *newpriv = nft_obj_data(newobj);
|
||||
struct nft_synproxy *priv = nft_obj_data(obj);
|
||||
|
||||
priv->info = newpriv->info;
|
||||
WRITE_ONCE(priv->info, newpriv->info);
|
||||
}
|
||||
|
||||
static struct nft_object_type nft_synproxy_obj_type;
|
||||
|
||||
@ -1764,7 +1764,7 @@ EXPORT_SYMBOL_GPL(xt_hook_ops_alloc);
|
||||
int xt_register_template(const struct xt_table *table,
|
||||
int (*table_init)(struct net *net))
|
||||
{
|
||||
int ret = -EEXIST, af = table->af;
|
||||
int ret = -EBUSY, af = table->af;
|
||||
struct xt_template *t;
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
|
||||
@ -29,7 +29,7 @@ TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
|
||||
net6_port_net6_port net_port_mac_proto_net"
|
||||
|
||||
# Reported bugs, also described by TYPE_ variables below
|
||||
BUGS="flush_remove_add reload net_port_proto_match avx2_mismatch doublecreate"
|
||||
BUGS="flush_remove_add reload net_port_proto_match avx2_mismatch doublecreate insert_overlap"
|
||||
|
||||
# List of possible paths to pktgen script from kernel tree for performance tests
|
||||
PKTGEN_SCRIPT_PATHS="
|
||||
@ -420,6 +420,18 @@ race_repeat 0
|
||||
perf_duration 0
|
||||
"
|
||||
|
||||
TYPE_insert_overlap="
|
||||
display reject overlapping range on add
|
||||
type_spec ipv4_addr . ipv4_addr
|
||||
chain_spec ip saddr . ip daddr
|
||||
dst addr4
|
||||
proto icmp
|
||||
|
||||
race_repeat 0
|
||||
|
||||
perf_duration 0
|
||||
"
|
||||
|
||||
# Set template for all tests, types and rules are filled in depending on test
|
||||
set_template='
|
||||
flush ruleset
|
||||
@ -1954,6 +1966,37 @@ EOF
|
||||
return 0
|
||||
}
|
||||
|
||||
add_fail()
|
||||
{
|
||||
if nft add element inet filter test "$1" 2>/dev/null ; then
|
||||
err "Returned success for add ${1} given set:"
|
||||
err "$(nft -a list set inet filter test )"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
test_bug_insert_overlap()
|
||||
{
|
||||
local elements="1.2.3.4 . 1.2.4.1"
|
||||
|
||||
setup veth send_"${proto}" set || return ${ksft_skip}
|
||||
|
||||
add "{ $elements }" || return 1
|
||||
|
||||
elements="1.2.3.0-1.2.3.4 . 1.2.4.1"
|
||||
add_fail "{ $elements }" || return 1
|
||||
|
||||
elements="1.2.3.0-1.2.3.4 . 1.2.4.2"
|
||||
add "{ $elements }" || return 1
|
||||
|
||||
elements="1.2.3.4 . 1.2.4.1-1.2.4.2"
|
||||
add_fail "{ $elements }" || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
test_reported_issues() {
|
||||
eval test_bug_"${subtest}"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user