]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.15
authorSasha Levin <sashal@kernel.org>
Sat, 26 Oct 2024 07:36:46 +0000 (03:36 -0400)
committerSasha Levin <sashal@kernel.org>
Sat, 26 Oct 2024 07:36:46 +0000 (03:36 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
14 files changed:
queue-5.15/be2net-fix-potential-memory-leak-in-be_xmit.patch [new file with mode: 0644]
queue-5.15/bpf-perf-fix-perf_event_detach_bpf_prog-error-handli.patch [new file with mode: 0644]
queue-5.15/net-dsa-mv88e6xxx-fix-error-when-setting-port-policy.patch [new file with mode: 0644]
queue-5.15/net-plip-fix-break-causing-plip-to-never-transmit.patch [new file with mode: 0644]
queue-5.15/net-sched-fix-use-after-free-in-taprio_change.patch [new file with mode: 0644]
queue-5.15/net-sun3_82586-fix-potential-memory-leak-in-sun3_825.patch [new file with mode: 0644]
queue-5.15/net-usb-usbnet-fix-name-regression.patch [new file with mode: 0644]
queue-5.15/net-wwan-fix-global-oob-in-wwan_rtnl_policy.patch [new file with mode: 0644]
queue-5.15/netfilter-xtables-fix-typo-causing-some-targets-not-.patch [new file with mode: 0644]
queue-5.15/posix-clock-posix-clock-fix-unbalanced-locking-in-pc.patch [new file with mode: 0644]
queue-5.15/r8169-avoid-unsolicited-interrupts.patch [new file with mode: 0644]
queue-5.15/series
queue-5.15/xfrm-extract-dst-lookup-parameters-into-a-struct.patch [new file with mode: 0644]
queue-5.15/xfrm-respect-ip-protocols-rules-criteria-when-perfor.patch [new file with mode: 0644]

diff --git a/queue-5.15/be2net-fix-potential-memory-leak-in-be_xmit.patch b/queue-5.15/be2net-fix-potential-memory-leak-in-be_xmit.patch
new file mode 100644 (file)
index 0000000..b37b569
--- /dev/null
@@ -0,0 +1,61 @@
+From 8a4112cd3169f39a13143645408970517b59b0f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Oct 2024 22:48:02 +0800
+Subject: be2net: fix potential memory leak in be_xmit()
+
+From: Wang Hai <wanghai38@huawei.com>
+
+[ Upstream commit e4dd8bfe0f6a23acd305f9b892c00899089bd621 ]
+
+The be_xmit() returns NETDEV_TX_OK without freeing skb
+in case of be_xmit_enqueue() fails, add dev_kfree_skb_any() to fix it.
+
+Fixes: 760c295e0e8d ("be2net: Support for OS2BMC.")
+Signed-off-by: Wang Hai <wanghai38@huawei.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
+Message-ID: <20241015144802.12150-1-wanghai38@huawei.com>
+Signed-off-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index b91029db1f211..13d5fe324d6c7 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1382,10 +1382,8 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)
+       be_get_wrb_params_from_skb(adapter, skb, &wrb_params);
+       wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params);
+-      if (unlikely(!wrb_cnt)) {
+-              dev_kfree_skb_any(skb);
+-              goto drop;
+-      }
++      if (unlikely(!wrb_cnt))
++              goto drop_skb;
+       /* if os2bmc is enabled and if the pkt is destined to bmc,
+        * enqueue the pkt a 2nd time with mgmt bit set.
+@@ -1394,7 +1392,7 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)
+               BE_WRB_F_SET(wrb_params.features, OS2BMC, 1);
+               wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params);
+               if (unlikely(!wrb_cnt))
+-                      goto drop;
++                      goto drop_skb;
+               else
+                       skb_get(skb);
+       }
+@@ -1408,6 +1406,8 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)
+               be_xmit_flush(adapter, txo);
+       return NETDEV_TX_OK;
++drop_skb:
++      dev_kfree_skb_any(skb);
+ drop:
+       tx_stats(txo)->tx_drv_drops++;
+       /* Flush the already enqueued tx requests */
+-- 
+2.43.0
+
diff --git a/queue-5.15/bpf-perf-fix-perf_event_detach_bpf_prog-error-handli.patch b/queue-5.15/bpf-perf-fix-perf_event_detach_bpf_prog-error-handli.patch
new file mode 100644 (file)
index 0000000..709057d
--- /dev/null
@@ -0,0 +1,46 @@
+From cac3b419c7ae1c29b4012dc82ad43c4018c23446 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 23 Oct 2024 22:03:52 +0200
+Subject: bpf,perf: Fix perf_event_detach_bpf_prog error handling
+
+From: Jiri Olsa <jolsa@kernel.org>
+
+[ Upstream commit 0ee288e69d033850bc87abe0f9cc3ada24763d7f ]
+
+Peter reported that perf_event_detach_bpf_prog might skip to release
+the bpf program for -ENOENT error from bpf_prog_array_copy.
+
+This can't happen because bpf program is stored in perf event and is
+detached and released only when perf event is freed.
+
+Let's drop the -ENOENT check and make sure the bpf program is released
+in any case.
+
+Fixes: 170a7e3ea070 ("bpf: bpf_prog_array_copy() should return -ENOENT if exclude_prog not found")
+Reported-by: Peter Zijlstra <peterz@infradead.org>
+Signed-off-by: Jiri Olsa <jolsa@kernel.org>
+Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
+Link: https://lore.kernel.org/bpf/20241023200352.3488610-1-jolsa@kernel.org
+
+Closes: https://lore.kernel.org/lkml/20241022111638.GC16066@noisy.programming.kicks-ass.net/
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/bpf_trace.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
+index a1dc0ff1962e6..126754b61edc0 100644
+--- a/kernel/trace/bpf_trace.c
++++ b/kernel/trace/bpf_trace.c
+@@ -1790,8 +1790,6 @@ void perf_event_detach_bpf_prog(struct perf_event *event)
+       old_array = bpf_event_rcu_dereference(event->tp_event->prog_array);
+       ret = bpf_prog_array_copy(old_array, event->prog, NULL, 0, &new_array);
+-      if (ret == -ENOENT)
+-              goto unlock;
+       if (ret < 0) {
+               bpf_prog_array_delete_safe(old_array, event->prog);
+       } else {
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-dsa-mv88e6xxx-fix-error-when-setting-port-policy.patch b/queue-5.15/net-dsa-mv88e6xxx-fix-error-when-setting-port-policy.patch
new file mode 100644 (file)
index 0000000..d3c6362
--- /dev/null
@@ -0,0 +1,41 @@
+From 0b867cf85222c799f0ea7d964383d247cd786bf5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Oct 2024 21:08:22 -0700
+Subject: net: dsa: mv88e6xxx: Fix error when setting port policy on mv88e6393x
+
+From: Peter Rashleigh <peter@rashleigh.ca>
+
+[ Upstream commit 12bc14949c4a7272b509af0f1022a0deeb215fd8 ]
+
+mv88e6393x_port_set_policy doesn't correctly shift the ptr value when
+converting the policy format between the old and new styles, so the
+target register ends up with the ptr being written over the data bits.
+
+Shift the pointer to align with the format expected by
+mv88e6393x_port_policy_write().
+
+Fixes: 6584b26020fc ("net: dsa: mv88e6xxx: implement .port_set_policy for Amethyst")
+Signed-off-by: Peter Rashleigh <peter@rashleigh.ca>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Message-ID: <20241016040822.3917-1-peter@rashleigh.ca>
+Signed-off-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/mv88e6xxx/port.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c
+index ab41619a809b3..c94f2de6401cd 100644
+--- a/drivers/net/dsa/mv88e6xxx/port.c
++++ b/drivers/net/dsa/mv88e6xxx/port.c
+@@ -1699,6 +1699,7 @@ int mv88e6393x_port_set_policy(struct mv88e6xxx_chip *chip, int port,
+       ptr = shift / 8;
+       shift %= 8;
+       mask >>= ptr * 8;
++      ptr <<= 8;
+       err = mv88e6393x_port_policy_read(chip, port, ptr, &reg);
+       if (err)
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-plip-fix-break-causing-plip-to-never-transmit.patch b/queue-5.15/net-plip-fix-break-causing-plip-to-never-transmit.patch
new file mode 100644 (file)
index 0000000..2741ce7
--- /dev/null
@@ -0,0 +1,45 @@
+From 6d598df5e14bc1873e9835e8530e0170f7f7b592 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Oct 2024 17:16:04 +0200
+Subject: net: plip: fix break; causing plip to never transmit
+
+From: Jakub Boehm <boehm.jakub@gmail.com>
+
+[ Upstream commit f99cf996ba5a315f8b9f13cc21dff0604a0eb749 ]
+
+Since commit
+  71ae2cb30531 ("net: plip: Fix fall-through warnings for Clang")
+
+plip was not able to send any packets, this patch replaces one
+unintended break; with fallthrough; which was originally missed by
+commit 9525d69a3667 ("net: plip: mark expected switch fall-throughs").
+
+I have verified with a real hardware PLIP connection that everything
+works once again after applying this patch.
+
+Fixes: 71ae2cb30531 ("net: plip: Fix fall-through warnings for Clang")
+Signed-off-by: Jakub Boehm <boehm.jakub@gmail.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Message-ID: <20241015-net-plip-tx-fix-v1-1-32d8be1c7e0b@gmail.com>
+Signed-off-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/plip/plip.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/plip/plip.c b/drivers/net/plip/plip.c
+index b1776116f9f7d..bea741afe78be 100644
+--- a/drivers/net/plip/plip.c
++++ b/drivers/net/plip/plip.c
+@@ -811,7 +811,7 @@ plip_send_packet(struct net_device *dev, struct net_local *nl,
+                               return HS_TIMEOUT;
+                       }
+               }
+-              break;
++              fallthrough;
+       case PLIP_PK_LENGTH_LSB:
+               if (plip_send(nibble_timeout, dev,
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-sched-fix-use-after-free-in-taprio_change.patch b/queue-5.15/net-sched-fix-use-after-free-in-taprio_change.patch
new file mode 100644 (file)
index 0000000..7484d03
--- /dev/null
@@ -0,0 +1,45 @@
+From 6a3a7d52814a8ccee67d8becc5ae74ecc6f9bdb1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 18 Oct 2024 08:13:38 +0300
+Subject: net: sched: fix use-after-free in taprio_change()
+
+From: Dmitry Antipov <dmantipov@yandex.ru>
+
+[ Upstream commit f504465970aebb2467da548f7c1efbbf36d0f44b ]
+
+In 'taprio_change()', 'admin' pointer may become dangling due to sched
+switch / removal caused by 'advance_sched()', and critical section
+protected by 'q->current_entry_lock' is too small to prevent from such
+a scenario (which causes use-after-free detected by KASAN). Fix this
+by prefer 'rcu_replace_pointer()' over 'rcu_assign_pointer()' to update
+'admin' immediately before an attempt to schedule freeing.
+
+Fixes: a3d43c0d56f1 ("taprio: Add support adding an admin schedule")
+Reported-by: syzbot+b65e0af58423fc8a73aa@syzkaller.appspotmail.com
+Closes: https://syzkaller.appspot.com/bug?extid=b65e0af58423fc8a73aa
+Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Link: https://patch.msgid.link/20241018051339.418890-1-dmantipov@yandex.ru
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sched/sch_taprio.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
+index 49831bd6a37d5..44b971ef343ce 100644
+--- a/net/sched/sch_taprio.c
++++ b/net/sched/sch_taprio.c
+@@ -1612,7 +1612,8 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
+               taprio_start_sched(sch, start, new_admin);
+-              rcu_assign_pointer(q->admin_sched, new_admin);
++              admin = rcu_replace_pointer(q->admin_sched, new_admin,
++                                          lockdep_rtnl_is_held());
+               if (admin)
+                       call_rcu(&admin->rcu, taprio_free_sched_cb);
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-sun3_82586-fix-potential-memory-leak-in-sun3_825.patch b/queue-5.15/net-sun3_82586-fix-potential-memory-leak-in-sun3_825.patch
new file mode 100644 (file)
index 0000000..accac8d
--- /dev/null
@@ -0,0 +1,37 @@
+From fa050d1430348a5a0fb969890943b0d29d61de3f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Oct 2024 22:41:48 +0800
+Subject: net/sun3_82586: fix potential memory leak in sun3_82586_send_packet()
+
+From: Wang Hai <wanghai38@huawei.com>
+
+[ Upstream commit 2cb3f56e827abb22c4168ad0c1bbbf401bb2f3b8 ]
+
+The sun3_82586_send_packet() returns NETDEV_TX_OK without freeing skb
+in case of skb->len being too long, add dev_kfree_skb() to fix it.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Wang Hai <wanghai38@huawei.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Message-ID: <20241015144148.7918-1-wanghai38@huawei.com>
+Signed-off-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/i825xx/sun3_82586.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/ethernet/i825xx/sun3_82586.c b/drivers/net/ethernet/i825xx/sun3_82586.c
+index 6c89aa7eaa222..95a6bbfa013e1 100644
+--- a/drivers/net/ethernet/i825xx/sun3_82586.c
++++ b/drivers/net/ethernet/i825xx/sun3_82586.c
+@@ -1012,6 +1012,7 @@ sun3_82586_send_packet(struct sk_buff *skb, struct net_device *dev)
+       if(skb->len > XMIT_BUFF_SIZE)
+       {
+               printk("%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n",dev->name,XMIT_BUFF_SIZE,skb->len);
++              dev_kfree_skb(skb);
+               return NETDEV_TX_OK;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-usb-usbnet-fix-name-regression.patch b/queue-5.15/net-usb-usbnet-fix-name-regression.patch
new file mode 100644 (file)
index 0000000..74edcae
--- /dev/null
@@ -0,0 +1,46 @@
+From e69e00195cbd064ed6087494eb95bcba3296590a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 17 Oct 2024 09:18:37 +0200
+Subject: net: usb: usbnet: fix name regression
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit 8a7d12d674ac6f2147c18f36d1e15f1a48060edf ]
+
+The fix for MAC addresses broke detection of the naming convention
+because it gave network devices no random MAC before bind()
+was called. This means that the check for the local assignment bit
+was always negative as the address was zeroed from allocation,
+instead of from overwriting the MAC with a unique hardware address.
+
+The correct check for whether bind() has altered the MAC is
+done with is_zero_ether_addr
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Reported-by: Greg Thelen <gthelen@google.com>
+Diagnosed-by: John Sperbeck <jsperbeck@google.com>
+Fixes: bab8eb0dd4cb9 ("usbnet: modern method to get random MAC")
+Link: https://patch.msgid.link/20241017071849.389636-1-oneukum@suse.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/usbnet.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index 2945e336505bf..f66975c452aa1 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -1769,7 +1769,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
+               // can rename the link if it knows better.
+               if ((dev->driver_info->flags & FLAG_ETHER) != 0 &&
+                   ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 ||
+-                   (net->dev_addr [0] & 0x02) == 0))
++                   /* somebody touched it*/
++                   !is_zero_ether_addr(net->dev_addr)))
+                       strscpy(net->name, "eth%d", sizeof(net->name));
+               /* WLAN devices should always be named "wlan%d" */
+               if ((dev->driver_info->flags & FLAG_WLAN) != 0)
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-wwan-fix-global-oob-in-wwan_rtnl_policy.patch b/queue-5.15/net-wwan-fix-global-oob-in-wwan_rtnl_policy.patch
new file mode 100644 (file)
index 0000000..ae6cc94
--- /dev/null
@@ -0,0 +1,107 @@
+From 1cb9591ac141a2865a946ad1aacd3886ec5c8d0d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 15 Oct 2024 21:16:21 +0800
+Subject: net: wwan: fix global oob in wwan_rtnl_policy
+
+From: Lin Ma <linma@zju.edu.cn>
+
+[ Upstream commit 47dd5447cab8ce30a847a0337d5341ae4c7476a7 ]
+
+The variable wwan_rtnl_link_ops assign a *bigger* maxtype which leads to
+a global out-of-bounds read when parsing the netlink attributes. Exactly
+same bug cause as the oob fixed in commit b33fb5b801c6 ("net: qualcomm:
+rmnet: fix global oob in rmnet_policy").
+
+==================================================================
+BUG: KASAN: global-out-of-bounds in validate_nla lib/nlattr.c:388 [inline]
+BUG: KASAN: global-out-of-bounds in __nla_validate_parse+0x19d7/0x29a0 lib/nlattr.c:603
+Read of size 1 at addr ffffffff8b09cb60 by task syz.1.66276/323862
+
+CPU: 0 PID: 323862 Comm: syz.1.66276 Not tainted 6.1.70 #1
+Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
+Call Trace:
+ <TASK>
+ __dump_stack lib/dump_stack.c:88 [inline]
+ dump_stack_lvl+0x177/0x231 lib/dump_stack.c:106
+ print_address_description mm/kasan/report.c:284 [inline]
+ print_report+0x14f/0x750 mm/kasan/report.c:395
+ kasan_report+0x139/0x170 mm/kasan/report.c:495
+ validate_nla lib/nlattr.c:388 [inline]
+ __nla_validate_parse+0x19d7/0x29a0 lib/nlattr.c:603
+ __nla_parse+0x3c/0x50 lib/nlattr.c:700
+ nla_parse_nested_deprecated include/net/netlink.h:1269 [inline]
+ __rtnl_newlink net/core/rtnetlink.c:3514 [inline]
+ rtnl_newlink+0x7bc/0x1fd0 net/core/rtnetlink.c:3623
+ rtnetlink_rcv_msg+0x794/0xef0 net/core/rtnetlink.c:6122
+ netlink_rcv_skb+0x1de/0x420 net/netlink/af_netlink.c:2508
+ netlink_unicast_kernel net/netlink/af_netlink.c:1326 [inline]
+ netlink_unicast+0x74b/0x8c0 net/netlink/af_netlink.c:1352
+ netlink_sendmsg+0x882/0xb90 net/netlink/af_netlink.c:1874
+ sock_sendmsg_nosec net/socket.c:716 [inline]
+ __sock_sendmsg net/socket.c:728 [inline]
+ ____sys_sendmsg+0x5cc/0x8f0 net/socket.c:2499
+ ___sys_sendmsg+0x21c/0x290 net/socket.c:2553
+ __sys_sendmsg net/socket.c:2582 [inline]
+ __do_sys_sendmsg net/socket.c:2591 [inline]
+ __se_sys_sendmsg+0x19e/0x270 net/socket.c:2589
+ do_syscall_x64 arch/x86/entry/common.c:51 [inline]
+ do_syscall_64+0x45/0x90 arch/x86/entry/common.c:81
+ entry_SYSCALL_64_after_hwframe+0x63/0xcd
+RIP: 0033:0x7f67b19a24ad
+RSP: 002b:00007f67b17febb8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
+RAX: ffffffffffffffda RBX: 00007f67b1b45f80 RCX: 00007f67b19a24ad
+RDX: 0000000000000000 RSI: 0000000020005e40 RDI: 0000000000000004
+RBP: 00007f67b1a1e01d R08: 0000000000000000 R09: 0000000000000000
+R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
+R13: 00007ffd2513764f R14: 00007ffd251376e0 R15: 00007f67b17fed40
+ </TASK>
+
+The buggy address belongs to the variable:
+ wwan_rtnl_policy+0x20/0x40
+
+The buggy address belongs to the physical page:
+page:ffffea00002c2700 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0xb09c
+flags: 0xfff00000001000(reserved|node=0|zone=1|lastcpupid=0x7ff)
+raw: 00fff00000001000 ffffea00002c2708 ffffea00002c2708 0000000000000000
+raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
+page dumped because: kasan: bad access detected
+page_owner info is not present (never set?)
+
+Memory state around the buggy address:
+ ffffffff8b09ca00: 05 f9 f9 f9 05 f9 f9 f9 00 01 f9 f9 00 01 f9 f9
+ ffffffff8b09ca80: 00 00 00 05 f9 f9 f9 f9 00 00 03 f9 f9 f9 f9 f9
+>ffffffff8b09cb00: 00 00 00 00 05 f9 f9 f9 00 00 00 00 f9 f9 f9 f9
+                                                       ^
+ ffffffff8b09cb80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+==================================================================
+
+According to the comment of `nla_parse_nested_deprecated`, use correct size
+`IFLA_WWAN_MAX` here to fix this issue.
+
+Fixes: 88b710532e53 ("wwan: add interface creation support")
+Signed-off-by: Lin Ma <linma@zju.edu.cn>
+Reviewed-by: Loic Poulain <loic.poulain@linaro.org>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/20241015131621.47503-1-linma@zju.edu.cn
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wwan/wwan_core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c
+index d293ab6880448..a83de4e3c189c 100644
+--- a/drivers/net/wwan/wwan_core.c
++++ b/drivers/net/wwan/wwan_core.c
+@@ -927,7 +927,7 @@ static const struct nla_policy wwan_rtnl_policy[IFLA_WWAN_MAX + 1] = {
+ static struct rtnl_link_ops wwan_rtnl_link_ops __read_mostly = {
+       .kind = "wwan",
+-      .maxtype = __IFLA_WWAN_MAX,
++      .maxtype = IFLA_WWAN_MAX,
+       .alloc = wwan_rtnl_alloc,
+       .validate = wwan_rtnl_validate,
+       .newlink = wwan_rtnl_newlink,
+-- 
+2.43.0
+
diff --git a/queue-5.15/netfilter-xtables-fix-typo-causing-some-targets-not-.patch b/queue-5.15/netfilter-xtables-fix-typo-causing-some-targets-not-.patch
new file mode 100644 (file)
index 0000000..28ea326
--- /dev/null
@@ -0,0 +1,74 @@
+From 0575994a803828926ab5af1032cdbcc440e85812 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 20 Oct 2024 14:49:51 +0200
+Subject: netfilter: xtables: fix typo causing some targets not to load on IPv6
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 306ed1728e8438caed30332e1ab46b28c25fe3d8 ]
+
+- There is no NFPROTO_IPV6 family for mark and NFLOG.
+- TRACE is also missing module autoload with NFPROTO_IPV6.
+
+This results in ip6tables failing to restore a ruleset. This issue has been
+reported by several users providing incomplete patches.
+
+Very similar to Ilya Katsnelson's patch including a missing chunk in the
+TRACE extension.
+
+Fixes: 0bfcb7b71e73 ("netfilter: xtables: avoid NFPROTO_UNSPEC where needed")
+Reported-by: Ignat Korchagin <ignat@cloudflare.com>
+Reported-by: Ilya Katsnelson <me@0upti.me>
+Reported-by: Krzysztof OlÄ™dzki <ole@ans.pl>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/xt_NFLOG.c | 2 +-
+ net/netfilter/xt_TRACE.c | 1 +
+ net/netfilter/xt_mark.c  | 2 +-
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/net/netfilter/xt_NFLOG.c b/net/netfilter/xt_NFLOG.c
+index d80abd6ccaf8f..6dcf4bc7e30b2 100644
+--- a/net/netfilter/xt_NFLOG.c
++++ b/net/netfilter/xt_NFLOG.c
+@@ -79,7 +79,7 @@ static struct xt_target nflog_tg_reg[] __read_mostly = {
+       {
+               .name       = "NFLOG",
+               .revision   = 0,
+-              .family     = NFPROTO_IPV4,
++              .family     = NFPROTO_IPV6,
+               .checkentry = nflog_tg_check,
+               .destroy    = nflog_tg_destroy,
+               .target     = nflog_tg,
+diff --git a/net/netfilter/xt_TRACE.c b/net/netfilter/xt_TRACE.c
+index f3fa4f11348cd..a642ff09fc8e8 100644
+--- a/net/netfilter/xt_TRACE.c
++++ b/net/netfilter/xt_TRACE.c
+@@ -49,6 +49,7 @@ static struct xt_target trace_tg_reg[] __read_mostly = {
+               .target         = trace_tg,
+               .checkentry     = trace_tg_check,
+               .destroy        = trace_tg_destroy,
++              .me             = THIS_MODULE,
+       },
+ #endif
+ };
+diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c
+index f76fe04fc9a4e..65b965ca40ea7 100644
+--- a/net/netfilter/xt_mark.c
++++ b/net/netfilter/xt_mark.c
+@@ -62,7 +62,7 @@ static struct xt_target mark_tg_reg[] __read_mostly = {
+       {
+               .name           = "MARK",
+               .revision       = 2,
+-              .family         = NFPROTO_IPV4,
++              .family         = NFPROTO_IPV6,
+               .target         = mark_tg,
+               .targetsize     = sizeof(struct xt_mark_tginfo2),
+               .me             = THIS_MODULE,
+-- 
+2.43.0
+
diff --git a/queue-5.15/posix-clock-posix-clock-fix-unbalanced-locking-in-pc.patch b/queue-5.15/posix-clock-posix-clock-fix-unbalanced-locking-in-pc.patch
new file mode 100644 (file)
index 0000000..ec61cd8
--- /dev/null
@@ -0,0 +1,58 @@
+From 29198d04f75f6a43a1545b1ad26c26e830dea705 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 18 Oct 2024 18:07:48 +0800
+Subject: posix-clock: posix-clock: Fix unbalanced locking in
+ pc_clock_settime()
+
+From: Jinjie Ruan <ruanjinjie@huawei.com>
+
+[ Upstream commit 6e62807c7fbb3c758d233018caf94dfea9c65dbd ]
+
+If get_clock_desc() succeeds, it calls fget() for the clockid's fd,
+and get the clk->rwsem read lock, so the error path should release
+the lock to make the lock balance and fput the clockid's fd to make
+the refcount balance and release the fd related resource.
+
+However the below commit left the error path locked behind resulting in
+unbalanced locking. Check timespec64_valid_strict() before
+get_clock_desc() to fix it, because the "ts" is not changed
+after that.
+
+Fixes: d8794ac20a29 ("posix-clock: Fix missing timespec64 check in pc_clock_settime()")
+Acked-by: Richard Cochran <richardcochran@gmail.com>
+Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
+Acked-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
+[pabeni@redhat.com: fixed commit message typo]
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/time/posix-clock.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/kernel/time/posix-clock.c b/kernel/time/posix-clock.c
+index 8127673bfc45e..05e73d209aa87 100644
+--- a/kernel/time/posix-clock.c
++++ b/kernel/time/posix-clock.c
+@@ -290,6 +290,9 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
+       struct posix_clock_desc cd;
+       int err;
++      if (!timespec64_valid_strict(ts))
++              return -EINVAL;
++
+       err = get_clock_desc(id, &cd);
+       if (err)
+               return err;
+@@ -299,9 +302,6 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
+               goto out;
+       }
+-      if (!timespec64_valid_strict(ts))
+-              return -EINVAL;
+-
+       if (cd.clk->ops.clock_settime)
+               err = cd.clk->ops.clock_settime(cd.clk, ts);
+       else
+-- 
+2.43.0
+
diff --git a/queue-5.15/r8169-avoid-unsolicited-interrupts.patch b/queue-5.15/r8169-avoid-unsolicited-interrupts.patch
new file mode 100644 (file)
index 0000000..ad19c54
--- /dev/null
@@ -0,0 +1,49 @@
+From 67a393236566efe9514e174f060d9508e66d17d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 18 Oct 2024 11:08:16 +0200
+Subject: r8169: avoid unsolicited interrupts
+
+From: Heiner Kallweit <hkallweit1@gmail.com>
+
+[ Upstream commit 10ce0db787004875f4dba068ea952207d1d8abeb ]
+
+It was reported that after resume from suspend a PCI error is logged
+and connectivity is broken. Error message is:
+PCI error (cmd = 0x0407, status_errs = 0x0000)
+The message seems to be a red herring as none of the error bits is set,
+and the PCI command register value also is normal. Exception handling
+for a PCI error includes a chip reset what apparently brakes connectivity
+here. The interrupt status bit triggering the PCI error handling isn't
+actually used on PCIe chip versions, so it's not clear why this bit is
+set by the chip. Fix this by ignoring this bit on PCIe chip versions.
+
+Fixes: 0e4851502f84 ("r8169: merge with version 8.001.00 of Realtek's r8168 driver")
+Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219388
+Tested-by: Atlas Yu <atlas.yu@canonical.com>
+Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/78e2f535-438f-4212-ad94-a77637ac6c9c@gmail.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
+index 7ce11c9529c58..8e910f3349b2a 100644
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -4627,7 +4627,9 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
+       if ((status & 0xffff) == 0xffff || !(status & tp->irq_mask))
+               return IRQ_NONE;
+-      if (unlikely(status & SYSErr)) {
++      /* At least RTL8168fp may unexpectedly set the SYSErr bit */
++      if (unlikely(status & SYSErr &&
++          tp->mac_version <= RTL_GIGA_MAC_VER_06)) {
+               rtl8169_pcierr_interrupt(tp->dev);
+               goto out;
+       }
+-- 
+2.43.0
+
index 2cb8103515761429f2f038e231c4c3f2513c93f6..07e493aee75a334a4ed29c013374ec7756610d0a 100644 (file)
@@ -48,3 +48,16 @@ asoc-qcom-sm8250-add-qrb4210-rb2-sndcard-compatible-.patch
 platform-x86-dell-sysman-add-support-for-alienware-p.patch
 jfs-fix-sanity-check-in-dbmount.patch
 tracing-consider-the-null-character-when-validating-.patch
+xfrm-extract-dst-lookup-parameters-into-a-struct.patch
+xfrm-respect-ip-protocols-rules-criteria-when-perfor.patch
+net-sun3_82586-fix-potential-memory-leak-in-sun3_825.patch
+be2net-fix-potential-memory-leak-in-be_xmit.patch
+net-plip-fix-break-causing-plip-to-never-transmit.patch
+net-dsa-mv88e6xxx-fix-error-when-setting-port-policy.patch
+netfilter-xtables-fix-typo-causing-some-targets-not-.patch
+net-wwan-fix-global-oob-in-wwan_rtnl_policy.patch
+net-usb-usbnet-fix-name-regression.patch
+net-sched-fix-use-after-free-in-taprio_change.patch
+r8169-avoid-unsolicited-interrupts.patch
+posix-clock-posix-clock-fix-unbalanced-locking-in-pc.patch
+bpf-perf-fix-perf_event_detach_bpf_prog-error-handli.patch
diff --git a/queue-5.15/xfrm-extract-dst-lookup-parameters-into-a-struct.patch b/queue-5.15/xfrm-extract-dst-lookup-parameters-into-a-struct.patch
new file mode 100644 (file)
index 0000000..c97a513
--- /dev/null
@@ -0,0 +1,325 @@
+From 4a09cb7d2ad82c390d034ba2b70bc2b412e1c333 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 Sep 2024 17:07:09 -0700
+Subject: xfrm: extract dst lookup parameters into a struct
+
+From: Eyal Birger <eyal.birger@gmail.com>
+
+[ Upstream commit e509996b16728e37d5a909a5c63c1bd64f23b306 ]
+
+Preparation for adding more fields to dst lookup functions without
+changing their signatures.
+
+Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Stable-dep-of: b84697210343 ("xfrm: respect ip protocols rules criteria when performing dst lookups")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/xfrm.h      | 26 +++++++++++++-------------
+ net/ipv4/xfrm4_policy.c | 38 ++++++++++++++++----------------------
+ net/ipv6/xfrm6_policy.c | 28 +++++++++++++---------------
+ net/xfrm/xfrm_device.c  | 11 ++++++++---
+ net/xfrm/xfrm_policy.c  | 35 +++++++++++++++++++++++------------
+ 5 files changed, 73 insertions(+), 65 deletions(-)
+
+diff --git a/include/net/xfrm.h b/include/net/xfrm.h
+index 2e2e30d31a763..642e0b60130d8 100644
+--- a/include/net/xfrm.h
++++ b/include/net/xfrm.h
+@@ -315,20 +315,23 @@ struct xfrm_if_cb {
+ void xfrm_if_register_cb(const struct xfrm_if_cb *ifcb);
+ void xfrm_if_unregister_cb(void);
++struct xfrm_dst_lookup_params {
++      struct net *net;
++      int tos;
++      int oif;
++      xfrm_address_t *saddr;
++      xfrm_address_t *daddr;
++      u32 mark;
++};
++
+ struct net_device;
+ struct xfrm_type;
+ struct xfrm_dst;
+ struct xfrm_policy_afinfo {
+       struct dst_ops          *dst_ops;
+-      struct dst_entry        *(*dst_lookup)(struct net *net,
+-                                             int tos, int oif,
+-                                             const xfrm_address_t *saddr,
+-                                             const xfrm_address_t *daddr,
+-                                             u32 mark);
+-      int                     (*get_saddr)(struct net *net, int oif,
+-                                           xfrm_address_t *saddr,
+-                                           xfrm_address_t *daddr,
+-                                           u32 mark);
++      struct dst_entry        *(*dst_lookup)(const struct xfrm_dst_lookup_params *params);
++      int                     (*get_saddr)(xfrm_address_t *saddr,
++                                           const struct xfrm_dst_lookup_params *params);
+       int                     (*fill_dst)(struct xfrm_dst *xdst,
+                                           struct net_device *dev,
+                                           const struct flowi *fl);
+@@ -1645,10 +1648,7 @@ static inline int xfrm_user_policy(struct sock *sk, int optname,
+ }
+ #endif
+-struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
+-                                  const xfrm_address_t *saddr,
+-                                  const xfrm_address_t *daddr,
+-                                  int family, u32 mark);
++struct dst_entry *__xfrm_dst_lookup(int family, const struct xfrm_dst_lookup_params *params);
+ struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
+index 4548a91acdc89..d1c2619e03740 100644
+--- a/net/ipv4/xfrm4_policy.c
++++ b/net/ipv4/xfrm4_policy.c
+@@ -17,47 +17,41 @@
+ #include <net/ip.h>
+ #include <net/l3mdev.h>
+-static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4,
+-                                          int tos, int oif,
+-                                          const xfrm_address_t *saddr,
+-                                          const xfrm_address_t *daddr,
+-                                          u32 mark)
++static struct dst_entry *__xfrm4_dst_lookup(struct flowi4 *fl4,
++                                          const struct xfrm_dst_lookup_params *params)
+ {
+       struct rtable *rt;
+       memset(fl4, 0, sizeof(*fl4));
+-      fl4->daddr = daddr->a4;
+-      fl4->flowi4_tos = tos;
+-      fl4->flowi4_l3mdev = l3mdev_master_ifindex_by_index(net, oif);
+-      fl4->flowi4_mark = mark;
+-      if (saddr)
+-              fl4->saddr = saddr->a4;
+-
+-      rt = __ip_route_output_key(net, fl4);
++      fl4->daddr = params->daddr->a4;
++      fl4->flowi4_tos = params->tos;
++      fl4->flowi4_l3mdev = l3mdev_master_ifindex_by_index(params->net,
++                                                          params->oif);
++      fl4->flowi4_mark = params->mark;
++      if (params->saddr)
++              fl4->saddr = params->saddr->a4;
++
++      rt = __ip_route_output_key(params->net, fl4);
+       if (!IS_ERR(rt))
+               return &rt->dst;
+       return ERR_CAST(rt);
+ }
+-static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos, int oif,
+-                                        const xfrm_address_t *saddr,
+-                                        const xfrm_address_t *daddr,
+-                                        u32 mark)
++static struct dst_entry *xfrm4_dst_lookup(const struct xfrm_dst_lookup_params *params)
+ {
+       struct flowi4 fl4;
+-      return __xfrm4_dst_lookup(net, &fl4, tos, oif, saddr, daddr, mark);
++      return __xfrm4_dst_lookup(&fl4, params);
+ }
+-static int xfrm4_get_saddr(struct net *net, int oif,
+-                         xfrm_address_t *saddr, xfrm_address_t *daddr,
+-                         u32 mark)
++static int xfrm4_get_saddr(xfrm_address_t *saddr,
++                         const struct xfrm_dst_lookup_params *params)
+ {
+       struct dst_entry *dst;
+       struct flowi4 fl4;
+-      dst = __xfrm4_dst_lookup(net, &fl4, 0, oif, NULL, daddr, mark);
++      dst = __xfrm4_dst_lookup(&fl4, params);
+       if (IS_ERR(dst))
+               return -EHOSTUNREACH;
+diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
+index 492b9692c0dc0..40183fdf7da0e 100644
+--- a/net/ipv6/xfrm6_policy.c
++++ b/net/ipv6/xfrm6_policy.c
+@@ -23,23 +23,21 @@
+ #include <net/ip6_route.h>
+ #include <net/l3mdev.h>
+-static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,
+-                                        const xfrm_address_t *saddr,
+-                                        const xfrm_address_t *daddr,
+-                                        u32 mark)
++static struct dst_entry *xfrm6_dst_lookup(const struct xfrm_dst_lookup_params *params)
+ {
+       struct flowi6 fl6;
+       struct dst_entry *dst;
+       int err;
+       memset(&fl6, 0, sizeof(fl6));
+-      fl6.flowi6_l3mdev = l3mdev_master_ifindex_by_index(net, oif);
+-      fl6.flowi6_mark = mark;
+-      memcpy(&fl6.daddr, daddr, sizeof(fl6.daddr));
+-      if (saddr)
+-              memcpy(&fl6.saddr, saddr, sizeof(fl6.saddr));
++      fl6.flowi6_l3mdev = l3mdev_master_ifindex_by_index(params->net,
++                                                         params->oif);
++      fl6.flowi6_mark = params->mark;
++      memcpy(&fl6.daddr, params->daddr, sizeof(fl6.daddr));
++      if (params->saddr)
++              memcpy(&fl6.saddr, params->saddr, sizeof(fl6.saddr));
+-      dst = ip6_route_output(net, NULL, &fl6);
++      dst = ip6_route_output(params->net, NULL, &fl6);
+       err = dst->error;
+       if (dst->error) {
+@@ -50,15 +48,14 @@ static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,
+       return dst;
+ }
+-static int xfrm6_get_saddr(struct net *net, int oif,
+-                         xfrm_address_t *saddr, xfrm_address_t *daddr,
+-                         u32 mark)
++static int xfrm6_get_saddr(xfrm_address_t *saddr,
++                         const struct xfrm_dst_lookup_params *params)
+ {
+       struct dst_entry *dst;
+       struct net_device *dev;
+       struct inet6_dev *idev;
+-      dst = xfrm6_dst_lookup(net, 0, oif, NULL, daddr, mark);
++      dst = xfrm6_dst_lookup(params);
+       if (IS_ERR(dst))
+               return -EHOSTUNREACH;
+@@ -68,7 +65,8 @@ static int xfrm6_get_saddr(struct net *net, int oif,
+               return -EHOSTUNREACH;
+       }
+       dev = idev->dev;
+-      ipv6_dev_get_saddr(dev_net(dev), dev, &daddr->in6, 0, &saddr->in6);
++      ipv6_dev_get_saddr(dev_net(dev), dev, &params->daddr->in6, 0,
++                         &saddr->in6);
+       dst_release(dst);
+       return 0;
+ }
+diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c
+index 8b8e957a69c36..4d13f7a372ab6 100644
+--- a/net/xfrm/xfrm_device.c
++++ b/net/xfrm/xfrm_device.c
+@@ -241,6 +241,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
+       dev = dev_get_by_index(net, xuo->ifindex);
+       if (!dev) {
++              struct xfrm_dst_lookup_params params;
++
+               if (!(xuo->flags & XFRM_OFFLOAD_INBOUND)) {
+                       saddr = &x->props.saddr;
+                       daddr = &x->id.daddr;
+@@ -249,9 +251,12 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
+                       daddr = &x->props.saddr;
+               }
+-              dst = __xfrm_dst_lookup(net, 0, 0, saddr, daddr,
+-                                      x->props.family,
+-                                      xfrm_smark_get(0, x));
++              memset(&params, 0, sizeof(params));
++              params.net = net;
++              params.saddr = saddr;
++              params.daddr = daddr;
++              params.mark = xfrm_smark_get(0, x);
++              dst = __xfrm_dst_lookup(x->props.family, &params);
+               if (IS_ERR(dst))
+                       return 0;
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index bc867d1905f52..ab6f5955aa9cf 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -251,10 +251,8 @@ static const struct xfrm_if_cb *xfrm_if_get_cb(void)
+       return rcu_dereference(xfrm_if_cb);
+ }
+-struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
+-                                  const xfrm_address_t *saddr,
+-                                  const xfrm_address_t *daddr,
+-                                  int family, u32 mark)
++struct dst_entry *__xfrm_dst_lookup(int family,
++                                  const struct xfrm_dst_lookup_params *params)
+ {
+       const struct xfrm_policy_afinfo *afinfo;
+       struct dst_entry *dst;
+@@ -263,7 +261,7 @@ struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
+       if (unlikely(afinfo == NULL))
+               return ERR_PTR(-EAFNOSUPPORT);
+-      dst = afinfo->dst_lookup(net, tos, oif, saddr, daddr, mark);
++      dst = afinfo->dst_lookup(params);
+       rcu_read_unlock();
+@@ -277,6 +275,7 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,
+                                               xfrm_address_t *prev_daddr,
+                                               int family, u32 mark)
+ {
++      struct xfrm_dst_lookup_params params;
+       struct net *net = xs_net(x);
+       xfrm_address_t *saddr = &x->props.saddr;
+       xfrm_address_t *daddr = &x->id.daddr;
+@@ -291,7 +290,14 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,
+               daddr = x->coaddr;
+       }
+-      dst = __xfrm_dst_lookup(net, tos, oif, saddr, daddr, family, mark);
++      params.net = net;
++      params.saddr = saddr;
++      params.daddr = daddr;
++      params.tos = tos;
++      params.oif = oif;
++      params.mark = mark;
++
++      dst = __xfrm_dst_lookup(family, &params);
+       if (!IS_ERR(dst)) {
+               if (prev_saddr != saddr)
+@@ -2342,15 +2348,15 @@ int __xfrm_sk_clone_policy(struct sock *sk, const struct sock *osk)
+ }
+ static int
+-xfrm_get_saddr(struct net *net, int oif, xfrm_address_t *local,
+-             xfrm_address_t *remote, unsigned short family, u32 mark)
++xfrm_get_saddr(unsigned short family, xfrm_address_t *saddr,
++             const struct xfrm_dst_lookup_params *params)
+ {
+       int err;
+       const struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
+       if (unlikely(afinfo == NULL))
+               return -EINVAL;
+-      err = afinfo->get_saddr(net, oif, local, remote, mark);
++      err = afinfo->get_saddr(saddr, params);
+       rcu_read_unlock();
+       return err;
+ }
+@@ -2379,9 +2385,14 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, const struct flowi *fl,
+                       remote = &tmpl->id.daddr;
+                       local = &tmpl->saddr;
+                       if (xfrm_addr_any(local, tmpl->encap_family)) {
+-                              error = xfrm_get_saddr(net, fl->flowi_oif,
+-                                                     &tmp, remote,
+-                                                     tmpl->encap_family, 0);
++                              struct xfrm_dst_lookup_params params;
++
++                              memset(&params, 0, sizeof(params));
++                              params.net = net;
++                              params.oif = fl->flowi_oif;
++                              params.daddr = remote;
++                              error = xfrm_get_saddr(tmpl->encap_family, &tmp,
++                                                     &params);
+                               if (error)
+                                       goto fail;
+                               local = &tmp;
+-- 
+2.43.0
+
diff --git a/queue-5.15/xfrm-respect-ip-protocols-rules-criteria-when-perfor.patch b/queue-5.15/xfrm-respect-ip-protocols-rules-criteria-when-perfor.patch
new file mode 100644 (file)
index 0000000..2038a16
--- /dev/null
@@ -0,0 +1,99 @@
+From 7f1ecf63258d37ccaf47558adcaf6d4eeb7e0e41 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 Sep 2024 17:07:10 -0700
+Subject: xfrm: respect ip protocols rules criteria when performing dst lookups
+
+From: Eyal Birger <eyal.birger@gmail.com>
+
+[ Upstream commit b8469721034300bbb6dec5b4bf32492c95e16a0c ]
+
+The series in the "fixes" tag added the ability to consider L4 attributes
+in routing rules.
+
+The dst lookup on the outer packet of encapsulated traffic in the xfrm
+code was not adapted to this change, thus routing behavior that relies
+on L4 information is not respected.
+
+Pass the ip protocol information when performing dst lookups.
+
+Fixes: a25724b05af0 ("Merge branch 'fib_rules-support-sport-dport-and-proto-match'")
+Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
+Tested-by: Antony Antony <antony.antony@secunet.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/xfrm.h      |  2 ++
+ net/ipv4/xfrm4_policy.c |  2 ++
+ net/ipv6/xfrm6_policy.c |  3 +++
+ net/xfrm/xfrm_policy.c  | 15 +++++++++++++++
+ 4 files changed, 22 insertions(+)
+
+diff --git a/include/net/xfrm.h b/include/net/xfrm.h
+index 642e0b60130d8..20ce2e1b3f61e 100644
+--- a/include/net/xfrm.h
++++ b/include/net/xfrm.h
+@@ -322,6 +322,8 @@ struct xfrm_dst_lookup_params {
+       xfrm_address_t *saddr;
+       xfrm_address_t *daddr;
+       u32 mark;
++      __u8 ipproto;
++      union flowi_uli uli;
+ };
+ struct net_device;
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
+index d1c2619e03740..5d8e38f4ecc07 100644
+--- a/net/ipv4/xfrm4_policy.c
++++ b/net/ipv4/xfrm4_policy.c
+@@ -30,6 +30,8 @@ static struct dst_entry *__xfrm4_dst_lookup(struct flowi4 *fl4,
+       fl4->flowi4_mark = params->mark;
+       if (params->saddr)
+               fl4->saddr = params->saddr->a4;
++      fl4->flowi4_proto = params->ipproto;
++      fl4->uli = params->uli;
+       rt = __ip_route_output_key(params->net, fl4);
+       if (!IS_ERR(rt))
+diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
+index 40183fdf7da0e..f5ef5e4c88df1 100644
+--- a/net/ipv6/xfrm6_policy.c
++++ b/net/ipv6/xfrm6_policy.c
+@@ -37,6 +37,9 @@ static struct dst_entry *xfrm6_dst_lookup(const struct xfrm_dst_lookup_params *p
+       if (params->saddr)
+               memcpy(&fl6.saddr, params->saddr, sizeof(fl6.saddr));
++      fl6.flowi4_proto = params->ipproto;
++      fl6.uli = params->uli;
++
+       dst = ip6_route_output(params->net, NULL, &fl6);
+       err = dst->error;
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index ab6f5955aa9cf..55ef8e8329243 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -296,6 +296,21 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,
+       params.tos = tos;
+       params.oif = oif;
+       params.mark = mark;
++      params.ipproto = x->id.proto;
++      if (x->encap) {
++              switch (x->encap->encap_type) {
++              case UDP_ENCAP_ESPINUDP:
++                      params.ipproto = IPPROTO_UDP;
++                      params.uli.ports.sport = x->encap->encap_sport;
++                      params.uli.ports.dport = x->encap->encap_dport;
++                      break;
++              case TCP_ENCAP_ESPINTCP:
++                      params.ipproto = IPPROTO_TCP;
++                      params.uli.ports.sport = x->encap->encap_sport;
++                      params.uli.ports.dport = x->encap->encap_dport;
++                      break;
++              }
++      }
+       dst = __xfrm_dst_lookup(family, &params);
+-- 
+2.43.0
+