aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSasha Levin <sashal@kernel.org>2024-04-19 07:43:52 -0400
committerSasha Levin <sashal@kernel.org>2024-04-19 07:43:52 -0400
commitd4f16d06156fa2e447caa8aedc5a60b7a58ba2b9 (patch)
treec59fbe7b54fa3d3909beedcf5e49813eb2cf0436
parent4de4b98e607ed5d17a836b979688ccf9e4c04374 (diff)
downloadstable-queue-d4f16d06156fa2e447caa8aedc5a60b7a58ba2b9.tar.gz
Fixes for 4.19
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--queue-4.19/netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch49
-rw-r--r--queue-4.19/netfilter-nf_tables-fix-potential-data-race-in-__nft.patch58
-rw-r--r--queue-4.19/series3
-rw-r--r--queue-4.19/tun-limit-printing-rate-when-illegal-packet-received.patch91
4 files changed, 201 insertions, 0 deletions
diff --git a/queue-4.19/netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch b/queue-4.19/netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch
new file mode 100644
index 0000000000..6a0757f054
--- /dev/null
+++ b/queue-4.19/netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch
@@ -0,0 +1,49 @@
+From f65bed74378019b4bae50803821a36668fff99f2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2019 22:59:05 +0200
+Subject: netfilter: nf_tables: __nft_expr_type_get() selects specific family
+ type
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 9cff126f73a7025bcb0883189b2bed90010a57d4 ]
+
+In case that there are two types, prefer the family specify extension.
+
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Stable-dep-of: f969eb84ce48 ("netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_tables_api.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index dc40222a9e66b..79d0545badcab 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -2081,14 +2081,17 @@ EXPORT_SYMBOL_GPL(nft_unregister_expr);
+ static const struct nft_expr_type *__nft_expr_type_get(u8 family,
+ struct nlattr *nla)
+ {
+- const struct nft_expr_type *type;
++ const struct nft_expr_type *type, *candidate = NULL;
+
+ list_for_each_entry(type, &nf_tables_expressions, list) {
+- if (!nla_strcmp(nla, type->name) &&
+- (!type->family || type->family == family))
+- return type;
++ if (!nla_strcmp(nla, type->name)) {
++ if (!type->family && !candidate)
++ candidate = type;
++ else if (type->family == family)
++ candidate = type;
++ }
+ }
+- return NULL;
++ return candidate;
+ }
+
+ static const struct nft_expr_type *nft_expr_type_get(struct net *net,
+--
+2.43.0
+
diff --git a/queue-4.19/netfilter-nf_tables-fix-potential-data-race-in-__nft.patch b/queue-4.19/netfilter-nf_tables-fix-potential-data-race-in-__nft.patch
new file mode 100644
index 0000000000..32de701805
--- /dev/null
+++ b/queue-4.19/netfilter-nf_tables-fix-potential-data-race-in-__nft.patch
@@ -0,0 +1,58 @@
+From ca4d6a0ef77a0c435235ad011b049a777ece97e9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Apr 2024 14:56:04 +0800
+Subject: netfilter: nf_tables: Fix potential data-race in
+ __nft_expr_type_get()
+
+From: Ziyang Xuan <william.xuanziyang@huawei.com>
+
+[ Upstream commit f969eb84ce482331a991079ab7a5c4dc3b7f89bf ]
+
+nft_unregister_expr() can concurrent with __nft_expr_type_get(),
+and there is not any protection when iterate over nf_tables_expressions
+list in __nft_expr_type_get(). Therefore, there is potential data-race
+of nf_tables_expressions list entry.
+
+Use list_for_each_entry_rcu() to iterate over nf_tables_expressions
+list in __nft_expr_type_get(), and use rcu_read_lock() in the caller
+nft_expr_type_get() to protect the entire type query process.
+
+Fixes: ef1f7df9170d ("netfilter: nf_tables: expression ops overloading")
+Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_tables_api.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index 79d0545badcab..db453d19f2a0f 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -2083,7 +2083,7 @@ static const struct nft_expr_type *__nft_expr_type_get(u8 family,
+ {
+ const struct nft_expr_type *type, *candidate = NULL;
+
+- list_for_each_entry(type, &nf_tables_expressions, list) {
++ list_for_each_entry_rcu(type, &nf_tables_expressions, list) {
+ if (!nla_strcmp(nla, type->name)) {
+ if (!type->family && !candidate)
+ candidate = type;
+@@ -2103,9 +2103,13 @@ static const struct nft_expr_type *nft_expr_type_get(struct net *net,
+ if (nla == NULL)
+ return ERR_PTR(-EINVAL);
+
++ rcu_read_lock();
+ type = __nft_expr_type_get(family, nla);
+- if (type != NULL && try_module_get(type->owner))
++ if (type != NULL && try_module_get(type->owner)) {
++ rcu_read_unlock();
+ return type;
++ }
++ rcu_read_unlock();
+
+ lockdep_nfnl_nft_mutex_not_held();
+ #ifdef CONFIG_MODULES
+--
+2.43.0
+
diff --git a/queue-4.19/series b/queue-4.19/series
index daa0cf9f06..244c1d5f01 100644
--- a/queue-4.19/series
+++ b/queue-4.19/series
@@ -14,3 +14,6 @@ btrfs-record-delayed-inode-root-in-transaction.patch
selftests-ftrace-limit-length-in-subsystem-enable-tests.patch
kprobes-fix-possible-use-after-free-issue-on-kprobe-registration.patch
revert-tracing-trigger-fix-to-return-error-if-failed-to-alloc-snapshot.patch
+netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch
+netfilter-nf_tables-fix-potential-data-race-in-__nft.patch
+tun-limit-printing-rate-when-illegal-packet-received.patch
diff --git a/queue-4.19/tun-limit-printing-rate-when-illegal-packet-received.patch b/queue-4.19/tun-limit-printing-rate-when-illegal-packet-received.patch
new file mode 100644
index 0000000000..2ac92baa25
--- /dev/null
+++ b/queue-4.19/tun-limit-printing-rate-when-illegal-packet-received.patch
@@ -0,0 +1,91 @@
+From 57ec6a8d03d0c2fb8e0c084ff77e26fd507e940d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Apr 2024 22:02:46 -0400
+Subject: tun: limit printing rate when illegal packet received by tun dev
+
+From: Lei Chen <lei.chen@smartx.com>
+
+[ Upstream commit f8bbc07ac535593139c875ffa19af924b1084540 ]
+
+vhost_worker will call tun call backs to receive packets. If too many
+illegal packets arrives, tun_do_read will keep dumping packet contents.
+When console is enabled, it will costs much more cpu time to dump
+packet and soft lockup will be detected.
+
+net_ratelimit mechanism can be used to limit the dumping rate.
+
+PID: 33036 TASK: ffff949da6f20000 CPU: 23 COMMAND: "vhost-32980"
+ #0 [fffffe00003fce50] crash_nmi_callback at ffffffff89249253
+ #1 [fffffe00003fce58] nmi_handle at ffffffff89225fa3
+ #2 [fffffe00003fceb0] default_do_nmi at ffffffff8922642e
+ #3 [fffffe00003fced0] do_nmi at ffffffff8922660d
+ #4 [fffffe00003fcef0] end_repeat_nmi at ffffffff89c01663
+ [exception RIP: io_serial_in+20]
+ RIP: ffffffff89792594 RSP: ffffa655314979e8 RFLAGS: 00000002
+ RAX: ffffffff89792500 RBX: ffffffff8af428a0 RCX: 0000000000000000
+ RDX: 00000000000003fd RSI: 0000000000000005 RDI: ffffffff8af428a0
+ RBP: 0000000000002710 R8: 0000000000000004 R9: 000000000000000f
+ R10: 0000000000000000 R11: ffffffff8acbf64f R12: 0000000000000020
+ R13: ffffffff8acbf698 R14: 0000000000000058 R15: 0000000000000000
+ ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
+ #5 [ffffa655314979e8] io_serial_in at ffffffff89792594
+ #6 [ffffa655314979e8] wait_for_xmitr at ffffffff89793470
+ #7 [ffffa65531497a08] serial8250_console_putchar at ffffffff897934f6
+ #8 [ffffa65531497a20] uart_console_write at ffffffff8978b605
+ #9 [ffffa65531497a48] serial8250_console_write at ffffffff89796558
+ #10 [ffffa65531497ac8] console_unlock at ffffffff89316124
+ #11 [ffffa65531497b10] vprintk_emit at ffffffff89317c07
+ #12 [ffffa65531497b68] printk at ffffffff89318306
+ #13 [ffffa65531497bc8] print_hex_dump at ffffffff89650765
+ #14 [ffffa65531497ca8] tun_do_read at ffffffffc0b06c27 [tun]
+ #15 [ffffa65531497d38] tun_recvmsg at ffffffffc0b06e34 [tun]
+ #16 [ffffa65531497d68] handle_rx at ffffffffc0c5d682 [vhost_net]
+ #17 [ffffa65531497ed0] vhost_worker at ffffffffc0c644dc [vhost]
+ #18 [ffffa65531497f10] kthread at ffffffff892d2e72
+ #19 [ffffa65531497f50] ret_from_fork at ffffffff89c0022f
+
+Fixes: ef3db4a59542 ("tun: avoid BUG, dump packet on GSO errors")
+Signed-off-by: Lei Chen <lei.chen@smartx.com>
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Acked-by: Jason Wang <jasowang@redhat.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Acked-by: Michael S. Tsirkin <mst@redhat.com>
+Link: https://lore.kernel.org/r/20240415020247.2207781-1-lei.chen@smartx.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/tun.c | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 625525275539a..5d1502772fb8e 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -2168,14 +2168,16 @@ static ssize_t tun_put_user(struct tun_struct *tun,
+ tun_is_little_endian(tun), true,
+ vlan_hlen)) {
+ struct skb_shared_info *sinfo = skb_shinfo(skb);
+- pr_err("unexpected GSO type: "
+- "0x%x, gso_size %d, hdr_len %d\n",
+- sinfo->gso_type, tun16_to_cpu(tun, gso.gso_size),
+- tun16_to_cpu(tun, gso.hdr_len));
+- print_hex_dump(KERN_ERR, "tun: ",
+- DUMP_PREFIX_NONE,
+- 16, 1, skb->head,
+- min((int)tun16_to_cpu(tun, gso.hdr_len), 64), true);
++
++ if (net_ratelimit()) {
++ netdev_err(tun->dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n",
++ sinfo->gso_type, tun16_to_cpu(tun, gso.gso_size),
++ tun16_to_cpu(tun, gso.hdr_len));
++ print_hex_dump(KERN_ERR, "tun: ",
++ DUMP_PREFIX_NONE,
++ 16, 1, skb->head,
++ min((int)tun16_to_cpu(tun, gso.hdr_len), 64), true);
++ }
+ WARN_ON_ONCE(1);
+ return -EINVAL;
+ }
+--
+2.43.0
+