]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Fri, 19 Apr 2024 11:43:52 +0000 (07:43 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 19 Apr 2024 11:43:52 +0000 (07:43 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/netfilter-nf_tables-__nft_expr_type_get-selects-spec.patch [new file with mode: 0644]
queue-4.19/netfilter-nf_tables-fix-potential-data-race-in-__nft.patch [new file with mode: 0644]
queue-4.19/series
queue-4.19/tun-limit-printing-rate-when-illegal-packet-received.patch [new file with mode: 0644]

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 (file)
index 0000000..6a0757f
--- /dev/null
@@ -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 (file)
index 0000000..32de701
--- /dev/null
@@ -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
+
index daa0cf9f06e1e0dfdadfb6f7332939cd056c20d1..244c1d5f01b58289c75ef5b4d66fd14b6f6f3998 100644 (file)
@@ -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 (file)
index 0000000..2ac92ba
--- /dev/null
@@ -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
+