]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.4
authorSasha Levin <sashal@kernel.org>
Mon, 21 Jul 2025 12:47:51 +0000 (08:47 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 21 Jul 2025 12:47:51 +0000 (08:47 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.4/bluetooth-fix-null-ptr-deref-in-l2cap_sock_resume_cb.patch [new file with mode: 0644]
queue-5.4/bluetooth-l2cap-fix-attempting-to-adjust-outgoing-mt.patch [new file with mode: 0644]
queue-5.4/bluetooth-smp-fix-using-hci_error_remote_user_term-o.patch [new file with mode: 0644]
queue-5.4/bluetooth-smp-if-an-unallowed-command-is-received-co.patch [new file with mode: 0644]
queue-5.4/net-emaclite-fix-missing-pointer-increment-in-aligne.patch [new file with mode: 0644]
queue-5.4/net-sched-return-null-when-htb_lookup_leaf-encounter.patch [new file with mode: 0644]
queue-5.4/net-sched-sch_qfq-fix-race-condition-on-qfq_aggregat.patch [new file with mode: 0644]
queue-5.4/net-vlan-fix-vlan-0-refcount-imbalance-of-toggling-f.patch [new file with mode: 0644]
queue-5.4/series
queue-5.4/usb-net-sierra-check-for-no-status-endpoint.patch [new file with mode: 0644]

diff --git a/queue-5.4/bluetooth-fix-null-ptr-deref-in-l2cap_sock_resume_cb.patch b/queue-5.4/bluetooth-fix-null-ptr-deref-in-l2cap_sock_resume_cb.patch
new file mode 100644 (file)
index 0000000..4681cf6
--- /dev/null
@@ -0,0 +1,80 @@
+From 62a2de17bc006a9e8c7b105a0e96ff29b0dfacab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 7 Jul 2025 19:28:29 +0000
+Subject: Bluetooth: Fix null-ptr-deref in l2cap_sock_resume_cb()
+
+From: Kuniyuki Iwashima <kuniyu@google.com>
+
+[ Upstream commit a0075accbf0d76c2dad1ad3993d2e944505d99a0 ]
+
+syzbot reported null-ptr-deref in l2cap_sock_resume_cb(). [0]
+
+l2cap_sock_resume_cb() has a similar problem that was fixed by commit
+1bff51ea59a9 ("Bluetooth: fix use-after-free error in lock_sock_nested()").
+
+Since both l2cap_sock_kill() and l2cap_sock_resume_cb() are executed
+under l2cap_sock_resume_cb(), we can avoid the issue simply by checking
+if chan->data is NULL.
+
+Let's not access to the killed socket in l2cap_sock_resume_cb().
+
+[0]:
+BUG: KASAN: null-ptr-deref in instrument_atomic_write include/linux/instrumented.h:82 [inline]
+BUG: KASAN: null-ptr-deref in clear_bit include/asm-generic/bitops/instrumented-atomic.h:41 [inline]
+BUG: KASAN: null-ptr-deref in l2cap_sock_resume_cb+0xb4/0x17c net/bluetooth/l2cap_sock.c:1711
+Write of size 8 at addr 0000000000000570 by task kworker/u9:0/52
+
+CPU: 1 UID: 0 PID: 52 Comm: kworker/u9:0 Not tainted 6.16.0-rc4-syzkaller-g7482bb149b9f #0 PREEMPT
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/07/2025
+Workqueue: hci0 hci_rx_work
+Call trace:
+ show_stack+0x2c/0x3c arch/arm64/kernel/stacktrace.c:501 (C)
+ __dump_stack+0x30/0x40 lib/dump_stack.c:94
+ dump_stack_lvl+0xd8/0x12c lib/dump_stack.c:120
+ print_report+0x58/0x84 mm/kasan/report.c:524
+ kasan_report+0xb0/0x110 mm/kasan/report.c:634
+ check_region_inline mm/kasan/generic.c:-1 [inline]
+ kasan_check_range+0x264/0x2a4 mm/kasan/generic.c:189
+ __kasan_check_write+0x20/0x30 mm/kasan/shadow.c:37
+ instrument_atomic_write include/linux/instrumented.h:82 [inline]
+ clear_bit include/asm-generic/bitops/instrumented-atomic.h:41 [inline]
+ l2cap_sock_resume_cb+0xb4/0x17c net/bluetooth/l2cap_sock.c:1711
+ l2cap_security_cfm+0x524/0xea0 net/bluetooth/l2cap_core.c:7357
+ hci_auth_cfm include/net/bluetooth/hci_core.h:2092 [inline]
+ hci_auth_complete_evt+0x2e8/0xa4c net/bluetooth/hci_event.c:3514
+ hci_event_func net/bluetooth/hci_event.c:7511 [inline]
+ hci_event_packet+0x650/0xe9c net/bluetooth/hci_event.c:7565
+ hci_rx_work+0x320/0xb18 net/bluetooth/hci_core.c:4070
+ process_one_work+0x7e8/0x155c kernel/workqueue.c:3238
+ process_scheduled_works kernel/workqueue.c:3321 [inline]
+ worker_thread+0x958/0xed8 kernel/workqueue.c:3402
+ kthread+0x5fc/0x75c kernel/kthread.c:464
+ ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:847
+
+Fixes: d97c899bde33 ("Bluetooth: Introduce L2CAP channel callback for resuming")
+Reported-by: syzbot+e4d73b165c3892852d22@syzkaller.appspotmail.com
+Closes: https://lore.kernel.org/all/686c12bd.a70a0220.29fe6c.0b13.GAE@google.com/
+Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/l2cap_sock.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
+index e6d93501e106d..93df53f2b76e3 100644
+--- a/net/bluetooth/l2cap_sock.c
++++ b/net/bluetooth/l2cap_sock.c
+@@ -1488,6 +1488,9 @@ static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
+ {
+       struct sock *sk = chan->data;
++      if (!sk)
++              return;
++
+       if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
+               sk->sk_state = BT_CONNECTED;
+               chan->state = BT_CONNECTED;
+-- 
+2.39.5
+
diff --git a/queue-5.4/bluetooth-l2cap-fix-attempting-to-adjust-outgoing-mt.patch b/queue-5.4/bluetooth-l2cap-fix-attempting-to-adjust-outgoing-mt.patch
new file mode 100644 (file)
index 0000000..a462c0b
--- /dev/null
@@ -0,0 +1,79 @@
+From a8fbc2b6e8e5f24173a3c3b01a21bb0ea1a5aee4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 16 Jul 2025 09:40:49 -0400
+Subject: Bluetooth: L2CAP: Fix attempting to adjust outgoing MTU
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit d24e4a7fedae121d33fb32ad785b87046527eedb ]
+
+Configuration request only configure the incoming direction of the peer
+initiating the request, so using the MTU is the other direction shall
+not be used, that said the spec allows the peer responding to adjust:
+
+Bluetooth Core 6.1, Vol 3, Part A, Section 4.5
+
+ 'Each configuration parameter value (if any is present) in an
+ L2CAP_CONFIGURATION_RSP packet reflects an ‘adjustment’ to a
+ configuration parameter value that has been sent (or, in case of
+ default values, implied) in the corresponding
+ L2CAP_CONFIGURATION_REQ packet.'
+
+That said adjusting the MTU in the response shall be limited to ERTM
+channels only as for older modes the remote stack may not be able to
+detect the adjustment causing it to silently drop packets.
+
+Link: https://github.com/bluez/bluez/issues/1422
+Link: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/149
+Link: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/4793
+Fixes: 042bb9603c44 ("Bluetooth: L2CAP: Fix L2CAP MTU negotiation")
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/l2cap_core.c | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
+index 4939152f6adc4..1272ad73e4011 100644
+--- a/net/bluetooth/l2cap_core.c
++++ b/net/bluetooth/l2cap_core.c
+@@ -3484,12 +3484,28 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data
+               /* Configure output options and let the other side know
+                * which ones we don't like. */
+-              /* If MTU is not provided in configure request, use the most recently
+-               * explicitly or implicitly accepted value for the other direction,
+-               * or the default value.
++              /* If MTU is not provided in configure request, try adjusting it
++               * to the current output MTU if it has been set
++               *
++               * Bluetooth Core 6.1, Vol 3, Part A, Section 4.5
++               *
++               * Each configuration parameter value (if any is present) in an
++               * L2CAP_CONFIGURATION_RSP packet reflects an ‘adjustment’ to a
++               * configuration parameter value that has been sent (or, in case
++               * of default values, implied) in the corresponding
++               * L2CAP_CONFIGURATION_REQ packet.
+                */
+-              if (mtu == 0)
+-                      mtu = chan->imtu ? chan->imtu : L2CAP_DEFAULT_MTU;
++              if (!mtu) {
++                      /* Only adjust for ERTM channels as for older modes the
++                       * remote stack may not be able to detect that the
++                       * adjustment causing it to silently drop packets.
++                       */
++                      if (chan->mode == L2CAP_MODE_ERTM &&
++                          chan->omtu && chan->omtu != L2CAP_DEFAULT_MTU)
++                              mtu = chan->omtu;
++                      else
++                              mtu = L2CAP_DEFAULT_MTU;
++              }
+               if (mtu < L2CAP_DEFAULT_MIN_MTU)
+                       result = L2CAP_CONF_UNACCEPT;
+-- 
+2.39.5
+
diff --git a/queue-5.4/bluetooth-smp-fix-using-hci_error_remote_user_term-o.patch b/queue-5.4/bluetooth-smp-fix-using-hci_error_remote_user_term-o.patch
new file mode 100644 (file)
index 0000000..cf4b8d5
--- /dev/null
@@ -0,0 +1,37 @@
+From fb21346c0131c6775b5b750f269425215874bafb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Jul 2025 11:53:40 -0400
+Subject: Bluetooth: SMP: Fix using HCI_ERROR_REMOTE_USER_TERM on timeout
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit 6ef99c917688a8510259e565bd1b168b7146295a ]
+
+This replaces the usage of HCI_ERROR_REMOTE_USER_TERM, which as the name
+suggest is to indicate a regular disconnection initiated by an user,
+with HCI_ERROR_AUTH_FAILURE to indicate the session has timeout thus any
+pairing shall be considered as failed.
+
+Fixes: 1e91c29eb60c ("Bluetooth: Use hci_disconnect for immediate disconnection from SMP")
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/smp.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
+index 3227956eb7417..65035d89af98c 100644
+--- a/net/bluetooth/smp.c
++++ b/net/bluetooth/smp.c
+@@ -1368,7 +1368,7 @@ static void smp_timeout(struct work_struct *work)
+       BT_DBG("conn %p", conn);
+-      hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
++      hci_disconnect(conn->hcon, HCI_ERROR_AUTH_FAILURE);
+ }
+ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
+-- 
+2.39.5
+
diff --git a/queue-5.4/bluetooth-smp-if-an-unallowed-command-is-received-co.patch b/queue-5.4/bluetooth-smp-if-an-unallowed-command-is-received-co.patch
new file mode 100644 (file)
index 0000000..3cecaa0
--- /dev/null
@@ -0,0 +1,130 @@
+From 5f6741001d7fb7316739040a75104411830e371f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 30 Jun 2025 14:42:23 -0400
+Subject: Bluetooth: SMP: If an unallowed command is received consider it a
+ failure
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit fe4840df0bdf341f376885271b7680764fe6b34e ]
+
+If a command is received while a bonding is ongoing consider it a
+pairing failure so the session is cleanup properly and the device is
+disconnected immediately instead of continuing with other commands that
+may result in the session to get stuck without ever completing such as
+the case bellow:
+
+> ACL Data RX: Handle 2048 flags 0x02 dlen 21
+      SMP: Identity Information (0x08) len 16
+        Identity resolving key[16]: d7e08edef97d3e62cd2331f82d8073b0
+> ACL Data RX: Handle 2048 flags 0x02 dlen 21
+      SMP: Signing Information (0x0a) len 16
+        Signature key[16]: 1716c536f94e843a9aea8b13ffde477d
+Bluetooth: hci0: unexpected SMP command 0x0a from XX:XX:XX:XX:XX:XX
+> ACL Data RX: Handle 2048 flags 0x02 dlen 12
+      SMP: Identity Address Information (0x09) len 7
+        Address: XX:XX:XX:XX:XX:XX (Intel Corporate)
+
+While accourding to core spec 6.1 the expected order is always BD_ADDR
+first first then CSRK:
+
+When using LE legacy pairing, the keys shall be distributed in the
+following order:
+
+    LTK by the Peripheral
+
+    EDIV and Rand by the Peripheral
+
+    IRK by the Peripheral
+
+    BD_ADDR by the Peripheral
+
+    CSRK by the Peripheral
+
+    LTK by the Central
+
+    EDIV and Rand by the Central
+
+    IRK by the Central
+
+    BD_ADDR by the Central
+
+    CSRK by the Central
+
+When using LE Secure Connections, the keys shall be distributed in the
+following order:
+
+    IRK by the Peripheral
+
+    BD_ADDR by the Peripheral
+
+    CSRK by the Peripheral
+
+    IRK by the Central
+
+    BD_ADDR by the Central
+
+    CSRK by the Central
+
+According to the Core 6.1 for commands used for key distribution "Key
+Rejected" can be used:
+
+  '3.6.1. Key distribution and generation
+
+  A device may reject a distributed key by sending the Pairing Failed command
+  with the reason set to "Key Rejected".
+
+Fixes: b28b4943660f ("Bluetooth: Add strict checks for allowed SMP PDUs")
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/smp.c | 19 ++++++++++++++++++-
+ net/bluetooth/smp.h |  1 +
+ 2 files changed, 19 insertions(+), 1 deletion(-)
+
+diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
+index 4d5ba9778885d..3227956eb7417 100644
+--- a/net/bluetooth/smp.c
++++ b/net/bluetooth/smp.c
+@@ -2908,8 +2908,25 @@ static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
+       if (code > SMP_CMD_MAX)
+               goto drop;
+-      if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
++      if (smp && !test_and_clear_bit(code, &smp->allow_cmd)) {
++              /* If there is a context and the command is not allowed consider
++               * it a failure so the session is cleanup properly.
++               */
++              switch (code) {
++              case SMP_CMD_IDENT_INFO:
++              case SMP_CMD_IDENT_ADDR_INFO:
++              case SMP_CMD_SIGN_INFO:
++                      /* 3.6.1. Key distribution and generation
++                       *
++                       * A device may reject a distributed key by sending the
++                       * Pairing Failed command with the reason set to
++                       * "Key Rejected".
++                       */
++                      smp_failure(conn, SMP_KEY_REJECTED);
++                      break;
++              }
+               goto drop;
++      }
+       /* If we don't have a context the only allowed commands are
+        * pairing request and security request.
+diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h
+index 121edadd5f8da..f17de3d9778d0 100644
+--- a/net/bluetooth/smp.h
++++ b/net/bluetooth/smp.h
+@@ -138,6 +138,7 @@ struct smp_cmd_keypress_notify {
+ #define SMP_NUMERIC_COMP_FAILED               0x0c
+ #define SMP_BREDR_PAIRING_IN_PROGRESS 0x0d
+ #define SMP_CROSS_TRANSP_NOT_ALLOWED  0x0e
++#define SMP_KEY_REJECTED              0x0f
+ #define SMP_MIN_ENC_KEY_SIZE          7
+ #define SMP_MAX_ENC_KEY_SIZE          16
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-emaclite-fix-missing-pointer-increment-in-aligne.patch b/queue-5.4/net-emaclite-fix-missing-pointer-increment-in-aligne.patch
new file mode 100644 (file)
index 0000000..7abf191
--- /dev/null
@@ -0,0 +1,40 @@
+From 19b0070ba20fd829c50d774cfaed746568203d95 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 10 Jul 2025 10:38:46 -0700
+Subject: net: emaclite: Fix missing pointer increment in aligned_read()
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 7727ec1523d7973defa1dff8f9c0aad288d04008 ]
+
+Add missing post-increment operators for byte pointers in the
+loop that copies remaining bytes in xemaclite_aligned_read().
+Without the increment, the same byte was written repeatedly
+to the destination.
+This update aligns with xemaclite_aligned_write()
+
+Fixes: bb81b2ddfa19 ("net: add Xilinx emac lite device driver")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Link: https://patch.msgid.link/20250710173849.2381003-1-alok.a.tiwari@oracle.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/xilinx/xilinx_emaclite.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+index 951482d899f9f..a834a0c7f7705 100644
+--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
++++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+@@ -293,7 +293,7 @@ static void xemaclite_aligned_read(u32 *src_ptr, u8 *dest_ptr,
+               /* Read the remaining data */
+               for (; length > 0; length--)
+-                      *to_u8_ptr = *from_u8_ptr;
++                      *to_u8_ptr++ = *from_u8_ptr++;
+       }
+ }
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-sched-return-null-when-htb_lookup_leaf-encounter.patch b/queue-5.4/net-sched-return-null-when-htb_lookup_leaf-encounter.patch
new file mode 100644 (file)
index 0000000..91646c4
--- /dev/null
@@ -0,0 +1,97 @@
+From 42c49c594df7237b6fedcc8b5cdd819538b66904 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 17 Jul 2025 02:28:38 +0000
+Subject: net/sched: Return NULL when htb_lookup_leaf encounters an empty
+ rbtree
+
+From: William Liu <will@willsroot.io>
+
+[ Upstream commit 0e1d5d9b5c5966e2e42e298670808590db5ed628 ]
+
+htb_lookup_leaf has a BUG_ON that can trigger with the following:
+
+tc qdisc del dev lo root
+tc qdisc add dev lo root handle 1: htb default 1
+tc class add dev lo parent 1: classid 1:1 htb rate 64bit
+tc qdisc add dev lo parent 1:1 handle 2: netem
+tc qdisc add dev lo parent 2:1 handle 3: blackhole
+ping -I lo -c1 -W0.001 127.0.0.1
+
+The root cause is the following:
+
+1. htb_dequeue calls htb_dequeue_tree which calls the dequeue handler on
+   the selected leaf qdisc
+2. netem_dequeue calls enqueue on the child qdisc
+3. blackhole_enqueue drops the packet and returns a value that is not
+   just NET_XMIT_SUCCESS
+4. Because of this, netem_dequeue calls qdisc_tree_reduce_backlog, and
+   since qlen is now 0, it calls htb_qlen_notify -> htb_deactivate ->
+   htb_deactiviate_prios -> htb_remove_class_from_row -> htb_safe_rb_erase
+5. As this is the only class in the selected hprio rbtree,
+   __rb_change_child in __rb_erase_augmented sets the rb_root pointer to
+   NULL
+6. Because blackhole_dequeue returns NULL, netem_dequeue returns NULL,
+   which causes htb_dequeue_tree to call htb_lookup_leaf with the same
+   hprio rbtree, and fail the BUG_ON
+
+The function graph for this scenario is shown here:
+ 0)               |  htb_enqueue() {
+ 0) + 13.635 us   |    netem_enqueue();
+ 0)   4.719 us    |    htb_activate_prios();
+ 0) # 2249.199 us |  }
+ 0)               |  htb_dequeue() {
+ 0)   2.355 us    |    htb_lookup_leaf();
+ 0)               |    netem_dequeue() {
+ 0) + 11.061 us   |      blackhole_enqueue();
+ 0)               |      qdisc_tree_reduce_backlog() {
+ 0)               |        qdisc_lookup_rcu() {
+ 0)   1.873 us    |          qdisc_match_from_root();
+ 0)   6.292 us    |        }
+ 0)   1.894 us    |        htb_search();
+ 0)               |        htb_qlen_notify() {
+ 0)   2.655 us    |          htb_deactivate_prios();
+ 0)   6.933 us    |        }
+ 0) + 25.227 us   |      }
+ 0)   1.983 us    |      blackhole_dequeue();
+ 0) + 86.553 us   |    }
+ 0) # 2932.761 us |    qdisc_warn_nonwc();
+ 0)               |    htb_lookup_leaf() {
+ 0)               |      BUG_ON();
+ ------------------------------------------
+
+The full original bug report can be seen here [1].
+
+We can fix this just by returning NULL instead of the BUG_ON,
+as htb_dequeue_tree returns NULL when htb_lookup_leaf returns
+NULL.
+
+[1] https://lore.kernel.org/netdev/pF5XOOIim0IuEfhI-SOxTgRvNoDwuux7UHKnE_Y5-zVd4wmGvNk2ceHjKb8ORnzw0cGwfmVu42g9dL7XyJLf1NEzaztboTWcm0Ogxuojoeo=@willsroot.io/
+
+Fixes: 512bb43eb542 ("pkt_sched: sch_htb: Optimize WARN_ONs in htb_dequeue_tree() etc.")
+Signed-off-by: William Liu <will@willsroot.io>
+Signed-off-by: Savino Dicanosa <savy@syst3mfailure.io>
+Link: https://patch.msgid.link/20250717022816.221364-1-will@willsroot.io
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sched/sch_htb.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
+index c618aae25b099..2562219ccca4b 100644
+--- a/net/sched/sch_htb.c
++++ b/net/sched/sch_htb.c
+@@ -776,7 +776,9 @@ static struct htb_class *htb_lookup_leaf(struct htb_prio *hprio, const int prio)
+               u32 *pid;
+       } stk[TC_HTB_MAXDEPTH], *sp = stk;
+-      BUG_ON(!hprio->row.rb_node);
++      if (unlikely(!hprio->row.rb_node))
++              return NULL;
++
+       sp->root = hprio->row.rb_node;
+       sp->pptr = &hprio->ptr;
+       sp->pid = &hprio->last_ptr_id;
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-sched-sch_qfq-fix-race-condition-on-qfq_aggregat.patch b/queue-5.4/net-sched-sch_qfq-fix-race-condition-on-qfq_aggregat.patch
new file mode 100644 (file)
index 0000000..c2e5c18
--- /dev/null
@@ -0,0 +1,115 @@
+From a35b237a006eb43d0234966bc631cd0adff7cbfc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 10 Jul 2025 03:09:42 -0700
+Subject: net/sched: sch_qfq: Fix race condition on qfq_aggregate
+
+From: Xiang Mei <xmei5@asu.edu>
+
+[ Upstream commit 5e28d5a3f774f118896aec17a3a20a9c5c9dfc64 ]
+
+A race condition can occur when 'agg' is modified in qfq_change_agg
+(called during qfq_enqueue) while other threads access it
+concurrently. For example, qfq_dump_class may trigger a NULL
+dereference, and qfq_delete_class may cause a use-after-free.
+
+This patch addresses the issue by:
+
+1. Moved qfq_destroy_class into the critical section.
+
+2. Added sch_tree_lock protection to qfq_dump_class and
+qfq_dump_class_stats.
+
+Fixes: 462dbc9101ac ("pkt_sched: QFQ Plus: fair-queueing service at DRR cost")
+Signed-off-by: Xiang Mei <xmei5@asu.edu>
+Reviewed-by: Cong Wang <xiyou.wangcong@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sched/sch_qfq.c | 30 +++++++++++++++++++++---------
+ 1 file changed, 21 insertions(+), 9 deletions(-)
+
+diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
+index c466d255f7865..2a4331a084949 100644
+--- a/net/sched/sch_qfq.c
++++ b/net/sched/sch_qfq.c
+@@ -408,7 +408,7 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
+       bool existing = false;
+       struct nlattr *tb[TCA_QFQ_MAX + 1];
+       struct qfq_aggregate *new_agg = NULL;
+-      u32 weight, lmax, inv_w;
++      u32 weight, lmax, inv_w, old_weight, old_lmax;
+       int err;
+       int delta_w;
+@@ -444,12 +444,16 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
+       inv_w = ONE_FP / weight;
+       weight = ONE_FP / inv_w;
+-      if (cl != NULL &&
+-          lmax == cl->agg->lmax &&
+-          weight == cl->agg->class_weight)
+-              return 0; /* nothing to change */
++      if (cl != NULL) {
++              sch_tree_lock(sch);
++              old_weight = cl->agg->class_weight;
++              old_lmax   = cl->agg->lmax;
++              sch_tree_unlock(sch);
++              if (lmax == old_lmax && weight == old_weight)
++                      return 0; /* nothing to change */
++      }
+-      delta_w = weight - (cl ? cl->agg->class_weight : 0);
++      delta_w = weight - (cl ? old_weight : 0);
+       if (q->wsum + delta_w > QFQ_MAX_WSUM) {
+               pr_notice("qfq: total weight out of range (%d + %u)\n",
+@@ -550,10 +554,10 @@ static int qfq_delete_class(struct Qdisc *sch, unsigned long arg)
+       qdisc_purge_queue(cl->qdisc);
+       qdisc_class_hash_remove(&q->clhash, &cl->common);
++      qfq_destroy_class(sch, cl);
+       sch_tree_unlock(sch);
+-      qfq_destroy_class(sch, cl);
+       return 0;
+ }
+@@ -620,6 +624,7 @@ static int qfq_dump_class(struct Qdisc *sch, unsigned long arg,
+ {
+       struct qfq_class *cl = (struct qfq_class *)arg;
+       struct nlattr *nest;
++      u32 class_weight, lmax;
+       tcm->tcm_parent = TC_H_ROOT;
+       tcm->tcm_handle = cl->common.classid;
+@@ -628,8 +633,13 @@ static int qfq_dump_class(struct Qdisc *sch, unsigned long arg,
+       nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
+       if (nest == NULL)
+               goto nla_put_failure;
+-      if (nla_put_u32(skb, TCA_QFQ_WEIGHT, cl->agg->class_weight) ||
+-          nla_put_u32(skb, TCA_QFQ_LMAX, cl->agg->lmax))
++
++      sch_tree_lock(sch);
++      class_weight    = cl->agg->class_weight;
++      lmax            = cl->agg->lmax;
++      sch_tree_unlock(sch);
++      if (nla_put_u32(skb, TCA_QFQ_WEIGHT, class_weight) ||
++          nla_put_u32(skb, TCA_QFQ_LMAX, lmax))
+               goto nla_put_failure;
+       return nla_nest_end(skb, nest);
+@@ -646,8 +656,10 @@ static int qfq_dump_class_stats(struct Qdisc *sch, unsigned long arg,
+       memset(&xstats, 0, sizeof(xstats));
++      sch_tree_lock(sch);
+       xstats.weight = cl->agg->class_weight;
+       xstats.lmax = cl->agg->lmax;
++      sch_tree_unlock(sch);
+       if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch),
+                                 d, NULL, &cl->bstats) < 0 ||
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-vlan-fix-vlan-0-refcount-imbalance-of-toggling-f.patch b/queue-5.4/net-vlan-fix-vlan-0-refcount-imbalance-of-toggling-f.patch
new file mode 100644 (file)
index 0000000..4407446
--- /dev/null
@@ -0,0 +1,204 @@
+From 8b0c23ed52bcf2d16295e45cbb4c2256f91691f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 16 Jul 2025 11:45:03 +0800
+Subject: net: vlan: fix VLAN 0 refcount imbalance of toggling filtering during
+ runtime
+
+From: Dong Chenchen <dongchenchen2@huawei.com>
+
+[ Upstream commit 579d4f9ca9a9a605184a9b162355f6ba131f678d ]
+
+Assuming the "rx-vlan-filter" feature is enabled on a net device, the
+8021q module will automatically add or remove VLAN 0 when the net device
+is put administratively up or down, respectively. There are a couple of
+problems with the above scheme.
+
+The first problem is a memory leak that can happen if the "rx-vlan-filter"
+feature is disabled while the device is running:
+
+ # ip link add bond1 up type bond mode 0
+ # ethtool -K bond1 rx-vlan-filter off
+ # ip link del dev bond1
+
+When the device is put administratively down the "rx-vlan-filter"
+feature is disabled, so the 8021q module will not remove VLAN 0 and the
+memory will be leaked [1].
+
+Another problem that can happen is that the kernel can automatically
+delete VLAN 0 when the device is put administratively down despite not
+adding it when the device was put administratively up since during that
+time the "rx-vlan-filter" feature was disabled. null-ptr-unref or
+bug_on[2] will be triggered by unregister_vlan_dev() for refcount
+imbalance if toggling filtering during runtime:
+
+$ ip link add bond0 type bond mode 0
+$ ip link add link bond0 name vlan0 type vlan id 0 protocol 802.1q
+$ ethtool -K bond0 rx-vlan-filter off
+$ ifconfig bond0 up
+$ ethtool -K bond0 rx-vlan-filter on
+$ ifconfig bond0 down
+$ ip link del vlan0
+
+Root cause is as below:
+step1: add vlan0 for real_dev, such as bond, team.
+register_vlan_dev
+    vlan_vid_add(real_dev,htons(ETH_P_8021Q),0) //refcnt=1
+step2: disable vlan filter feature and enable real_dev
+step3: change filter from 0 to 1
+vlan_device_event
+    vlan_filter_push_vids
+        ndo_vlan_rx_add_vid //No refcnt added to real_dev vlan0
+step4: real_dev down
+vlan_device_event
+    vlan_vid_del(dev, htons(ETH_P_8021Q), 0); //refcnt=0
+        vlan_info_rcu_free //free vlan0
+step5: delete vlan0
+unregister_vlan_dev
+    BUG_ON(!vlan_info); //vlan_info is null
+
+Fix both problems by noting in the VLAN info whether VLAN 0 was
+automatically added upon NETDEV_UP and based on that decide whether it
+should be deleted upon NETDEV_DOWN, regardless of the state of the
+"rx-vlan-filter" feature.
+
+[1]
+unreferenced object 0xffff8880068e3100 (size 256):
+  comm "ip", pid 384, jiffies 4296130254
+  hex dump (first 32 bytes):
+    00 20 30 0d 80 88 ff ff 00 00 00 00 00 00 00 00  . 0.............
+    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+  backtrace (crc 81ce31fa):
+    __kmalloc_cache_noprof+0x2b5/0x340
+    vlan_vid_add+0x434/0x940
+    vlan_device_event.cold+0x75/0xa8
+    notifier_call_chain+0xca/0x150
+    __dev_notify_flags+0xe3/0x250
+    rtnl_configure_link+0x193/0x260
+    rtnl_newlink_create+0x383/0x8e0
+    __rtnl_newlink+0x22c/0xa40
+    rtnl_newlink+0x627/0xb00
+    rtnetlink_rcv_msg+0x6fb/0xb70
+    netlink_rcv_skb+0x11f/0x350
+    netlink_unicast+0x426/0x710
+    netlink_sendmsg+0x75a/0xc20
+    __sock_sendmsg+0xc1/0x150
+    ____sys_sendmsg+0x5aa/0x7b0
+    ___sys_sendmsg+0xfc/0x180
+
+[2]
+kernel BUG at net/8021q/vlan.c:99!
+Oops: invalid opcode: 0000 [#1] SMP KASAN PTI
+CPU: 0 UID: 0 PID: 382 Comm: ip Not tainted 6.16.0-rc3 #61 PREEMPT(voluntary)
+Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
+BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
+RIP: 0010:unregister_vlan_dev (net/8021q/vlan.c:99 (discriminator 1))
+RSP: 0018:ffff88810badf310 EFLAGS: 00010246
+RAX: 0000000000000000 RBX: ffff88810da84000 RCX: ffffffffb47ceb9a
+RDX: dffffc0000000000 RSI: 0000000000000008 RDI: ffff88810e8b43c8
+RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff6cefe80
+R10: ffffffffb677f407 R11: ffff88810badf3c0 R12: ffff88810e8b4000
+R13: 0000000000000000 R14: ffff88810642a5c0 R15: 000000000000017e
+FS:  00007f1ff68c20c0(0000) GS:ffff888163a24000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 00007f1ff5dad240 CR3: 0000000107e56000 CR4: 00000000000006f0
+Call Trace:
+ <TASK>
+rtnl_dellink (net/core/rtnetlink.c:3511 net/core/rtnetlink.c:3553)
+rtnetlink_rcv_msg (net/core/rtnetlink.c:6945)
+netlink_rcv_skb (net/netlink/af_netlink.c:2535)
+netlink_unicast (net/netlink/af_netlink.c:1314 net/netlink/af_netlink.c:1339)
+netlink_sendmsg (net/netlink/af_netlink.c:1883)
+____sys_sendmsg (net/socket.c:712 net/socket.c:727 net/socket.c:2566)
+___sys_sendmsg (net/socket.c:2622)
+__sys_sendmsg (net/socket.c:2652)
+do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
+
+Fixes: ad1afb003939 ("vlan_dev: VLAN 0 should be treated as "no vlan tag" (802.1p packet)")
+Reported-by: syzbot+a8b046e462915c65b10b@syzkaller.appspotmail.com
+Closes: https://syzkaller.appspot.com/bug?extid=a8b046e462915c65b10b
+Suggested-by: Ido Schimmel <idosch@idosch.org>
+Signed-off-by: Dong Chenchen <dongchenchen2@huawei.com>
+Reviewed-by: Ido Schimmel <idosch@nvidia.com>
+Link: https://patch.msgid.link/20250716034504.2285203-2-dongchenchen2@huawei.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/8021q/vlan.c | 42 +++++++++++++++++++++++++++++++++---------
+ net/8021q/vlan.h |  1 +
+ 2 files changed, 34 insertions(+), 9 deletions(-)
+
+diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
+index c75fca3eed49e..14244445f944a 100644
+--- a/net/8021q/vlan.c
++++ b/net/8021q/vlan.c
+@@ -354,6 +354,35 @@ static int __vlan_device_event(struct net_device *dev, unsigned long event)
+       return err;
+ }
++static void vlan_vid0_add(struct net_device *dev)
++{
++      struct vlan_info *vlan_info;
++      int err;
++
++      if (!(dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
++              return;
++
++      pr_info("adding VLAN 0 to HW filter on device %s\n", dev->name);
++
++      err = vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
++      if (err)
++              return;
++
++      vlan_info = rtnl_dereference(dev->vlan_info);
++      vlan_info->auto_vid0 = true;
++}
++
++static void vlan_vid0_del(struct net_device *dev)
++{
++      struct vlan_info *vlan_info = rtnl_dereference(dev->vlan_info);
++
++      if (!vlan_info || !vlan_info->auto_vid0)
++              return;
++
++      vlan_info->auto_vid0 = false;
++      vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
++}
++
+ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
+                            void *ptr)
+ {
+@@ -375,15 +404,10 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
+                       return notifier_from_errno(err);
+       }
+-      if ((event == NETDEV_UP) &&
+-          (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) {
+-              pr_info("adding VLAN 0 to HW filter on device %s\n",
+-                      dev->name);
+-              vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
+-      }
+-      if (event == NETDEV_DOWN &&
+-          (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
+-              vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
++      if (event == NETDEV_UP)
++              vlan_vid0_add(dev);
++      else if (event == NETDEV_DOWN)
++              vlan_vid0_del(dev);
+       vlan_info = rtnl_dereference(dev->vlan_info);
+       if (!vlan_info)
+diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
+index 6728d15939295..f0d78018b0d23 100644
+--- a/net/8021q/vlan.h
++++ b/net/8021q/vlan.h
+@@ -33,6 +33,7 @@ struct vlan_info {
+       struct vlan_group       grp;
+       struct list_head        vid_list;
+       unsigned int            nr_vids;
++      bool                    auto_vid0;
+       struct rcu_head         rcu;
+ };
+-- 
+2.39.5
+
index 28a3194793894bac63317e9ae163eeda5bfeca64..dac54a8c5aa9b8efd0508a95c926478196ce0afa 100644 (file)
@@ -28,3 +28,12 @@ comedi-das16m1-fix-bit-shift-out-of-bounds.patch
 comedi-das6402-fix-bit-shift-out-of-bounds.patch
 comedi-fix-some-signed-shift-left-operations.patch
 comedi-fix-use-of-uninitialized-data-in-insn_rw_emulate_bits.patch
+net-emaclite-fix-missing-pointer-increment-in-aligne.patch
+net-sched-sch_qfq-fix-race-condition-on-qfq_aggregat.patch
+usb-net-sierra-check-for-no-status-endpoint.patch
+bluetooth-fix-null-ptr-deref-in-l2cap_sock_resume_cb.patch
+bluetooth-smp-if-an-unallowed-command-is-received-co.patch
+bluetooth-smp-fix-using-hci_error_remote_user_term-o.patch
+bluetooth-l2cap-fix-attempting-to-adjust-outgoing-mt.patch
+net-vlan-fix-vlan-0-refcount-imbalance-of-toggling-f.patch
+net-sched-return-null-when-htb_lookup_leaf-encounter.patch
diff --git a/queue-5.4/usb-net-sierra-check-for-no-status-endpoint.patch b/queue-5.4/usb-net-sierra-check-for-no-status-endpoint.patch
new file mode 100644 (file)
index 0000000..4f4fd71
--- /dev/null
@@ -0,0 +1,44 @@
+From 19c8e0a8cd2ae69e91e6c7e2338f8a2288598923 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 14 Jul 2025 13:12:56 +0200
+Subject: usb: net: sierra: check for no status endpoint
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit 4c4ca3c46167518f8534ed70f6e3b4bf86c4d158 ]
+
+The driver checks for having three endpoints and
+having bulk in and out endpoints, but not that
+the third endpoint is interrupt input.
+Rectify the omission.
+
+Reported-by: syzbot+3f89ec3d1d0842e95d50@syzkaller.appspotmail.com
+Closes: https://lore.kernel.org/linux-usb/686d5a9f.050a0220.1ffab7.0017.GAE@google.com/
+Tested-by: syzbot+3f89ec3d1d0842e95d50@syzkaller.appspotmail.com
+Fixes: eb4fd8cd355c8 ("net/usb: add sierra_net.c driver")
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Link: https://patch.msgid.link/20250714111326.258378-1-oneukum@suse.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/sierra_net.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c
+index 6f9ec5ce61dcc..a8f8134fab36c 100644
+--- a/drivers/net/usb/sierra_net.c
++++ b/drivers/net/usb/sierra_net.c
+@@ -694,6 +694,10 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf)
+                       status);
+               return -ENODEV;
+       }
++      if (!dev->status) {
++              dev_err(&dev->udev->dev, "No status endpoint found");
++              return -ENODEV;
++      }
+       /* Initialize sierra private data */
+       priv = kzalloc(sizeof *priv, GFP_KERNEL);
+       if (!priv)
+-- 
+2.39.5
+