]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 30 Apr 2024 08:52:03 +0000 (10:52 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 30 Apr 2024 08:52:03 +0000 (10:52 +0200)
added patches:
udp-preserve-the-connected-status-if-only-udp-cmsg.patch

queue-5.4/series
queue-5.4/udp-preserve-the-connected-status-if-only-udp-cmsg.patch [new file with mode: 0644]

index 5f683844fb3911dbd35db71af75ae09bf9ef60b9..c882ad29448ff47b2cd229217d4eebc13df5285a 100644 (file)
@@ -103,3 +103,4 @@ i2c-smbus-fix-null-function-pointer-dereference.patch
 hid-i2c-hid-remove-i2c_hid_read_pending-flag-to-prevent-lock-up.patch
 bounds-use-the-right-number-of-bits-for-power-of-two-config_nr_cpus.patch
 dm-limit-the-number-of-targets-and-parameter-size-area.patch
+udp-preserve-the-connected-status-if-only-udp-cmsg.patch
diff --git a/queue-5.4/udp-preserve-the-connected-status-if-only-udp-cmsg.patch b/queue-5.4/udp-preserve-the-connected-status-if-only-udp-cmsg.patch
new file mode 100644 (file)
index 0000000..2aa95ab
--- /dev/null
@@ -0,0 +1,71 @@
+From 680d11f6e5427b6af1321932286722d24a8b16c1 Mon Sep 17 00:00:00 2001
+From: Yick Xie <yick.xie@gmail.com>
+Date: Fri, 19 Apr 2024 01:06:10 +0800
+Subject: udp: preserve the connected status if only UDP cmsg
+
+From: Yick Xie <yick.xie@gmail.com>
+
+commit 680d11f6e5427b6af1321932286722d24a8b16c1 upstream.
+
+If "udp_cmsg_send()" returned 0 (i.e. only UDP cmsg),
+"connected" should not be set to 0. Otherwise it stops
+the connected socket from using the cached route.
+
+Fixes: 2e8de8576343 ("udp: add gso segment cmsg")
+Signed-off-by: Yick Xie <yick.xie@gmail.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Link: https://lore.kernel.org/r/20240418170610.867084-1-yick.xie@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Yick Xie <yick.xie@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv4/udp.c |    5 +++--
+ net/ipv6/udp.c |    5 +++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -1054,16 +1054,17 @@ int udp_sendmsg(struct sock *sk, struct
+       if (msg->msg_controllen) {
+               err = udp_cmsg_send(sk, msg, &ipc.gso_size);
+-              if (err > 0)
++              if (err > 0) {
+                       err = ip_cmsg_send(sk, msg, &ipc,
+                                          sk->sk_family == AF_INET6);
++                      connected = 0;
++              }
+               if (unlikely(err < 0)) {
+                       kfree(ipc.opt);
+                       return err;
+               }
+               if (ipc.opt)
+                       free = 1;
+-              connected = 0;
+       }
+       if (!ipc.opt) {
+               struct ip_options_rcu *inet_opt;
+--- a/net/ipv6/udp.c
++++ b/net/ipv6/udp.c
+@@ -1387,9 +1387,11 @@ do_udp_sendmsg:
+               ipc6.opt = opt;
+               err = udp_cmsg_send(sk, msg, &ipc6.gso_size);
+-              if (err > 0)
++              if (err > 0) {
+                       err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6,
+                                                   &ipc6);
++                      connected = false;
++              }
+               if (err < 0) {
+                       fl6_sock_release(flowlabel);
+                       return err;
+@@ -1401,7 +1403,6 @@ do_udp_sendmsg:
+               }
+               if (!(opt->opt_nflen|opt->opt_flen))
+                       opt = NULL;
+-              connected = false;
+       }
+       if (!opt) {
+               opt = txopt_get(np);