]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Mon, 5 Aug 2024 12:18:10 +0000 (08:18 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 5 Aug 2024 12:18:10 +0000 (08:18 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/drm-vmwgfx-fix-overlay-when-using-screen-targets.patch [new file with mode: 0644]
queue-4.19/ipv6-fix-ndisc_is_useropt-handling-for-pio.patch [new file with mode: 0644]
queue-4.19/net-iucv-fix-use-after-free-in-iucv_sock_close.patch [new file with mode: 0644]
queue-4.19/series

diff --git a/queue-4.19/drm-vmwgfx-fix-overlay-when-using-screen-targets.patch b/queue-4.19/drm-vmwgfx-fix-overlay-when-using-screen-targets.patch
new file mode 100644 (file)
index 0000000..b885e50
--- /dev/null
@@ -0,0 +1,41 @@
+From de1d289349360c72a0acb6aeab94415a2897f2d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 19 Jul 2024 11:36:27 -0500
+Subject: drm/vmwgfx: Fix overlay when using Screen Targets
+
+From: Ian Forbes <ian.forbes@broadcom.com>
+
+[ Upstream commit cb372a505a994cb39aa75acfb8b3bcf94787cf94 ]
+
+This code was never updated to support Screen Targets.
+Fixes a bug where Xv playback displays a green screen instead of actual
+video contents when 3D acceleration is disabled in the guest.
+
+Fixes: c8261a961ece ("vmwgfx: Major KMS refactoring / cleanup in preparation of screen targets")
+Reported-by: Doug Brown <doug@schmorgal.com>
+Closes: https://lore.kernel.org/all/bd9cb3c7-90e8-435d-bc28-0e38fee58977@schmorgal.com
+Signed-off-by: Ian Forbes <ian.forbes@broadcom.com>
+Tested-by: Doug Brown <doug@schmorgal.com>
+Signed-off-by: Zack Rusin <zack.rusin@broadcom.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240719163627.20888-1-ian.forbes@broadcom.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
+index 9f1b9d289bec5..5318c949e891a 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
+@@ -100,7 +100,7 @@ static int vmw_overlay_send_put(struct vmw_private *dev_priv,
+ {
+       struct vmw_escape_video_flush *flush;
+       size_t fifo_size;
+-      bool have_so = (dev_priv->active_display_unit == vmw_du_screen_object);
++      bool have_so = (dev_priv->active_display_unit != vmw_du_legacy);
+       int i, num_items;
+       SVGAGuestPtr ptr;
+-- 
+2.43.0
+
diff --git a/queue-4.19/ipv6-fix-ndisc_is_useropt-handling-for-pio.patch b/queue-4.19/ipv6-fix-ndisc_is_useropt-handling-for-pio.patch
new file mode 100644 (file)
index 0000000..fbe2d40
--- /dev/null
@@ -0,0 +1,92 @@
+From 53349cac8a1efe684e68bdb6bc8f7340ad697748 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jul 2024 17:17:48 -0700
+Subject: ipv6: fix ndisc_is_useropt() handling for PIO
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Maciej Żenczykowski <maze@google.com>
+
+[ Upstream commit a46c68debf3be3a477a69ccbf0a1d050df841676 ]
+
+The current logic only works if the PIO is between two
+other ND user options.  This fixes it so that the PIO
+can also be either before or after other ND user options
+(for example the first or last option in the RA).
+
+side note: there's actually Android tests verifying
+a portion of the old broken behaviour, so:
+  https://android-review.googlesource.com/c/kernel/tests/+/3196704
+fixes those up.
+
+Cc: Jen Linkova <furry@google.com>
+Cc: Lorenzo Colitti <lorenzo@google.com>
+Cc: Patrick Rohr <prohr@google.com>
+Cc: David Ahern <dsahern@kernel.org>
+Cc: YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org>
+Cc: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Maciej Żenczykowski <maze@google.com>
+Fixes: 048c796beb6e ("ipv6: adjust ndisc_is_useropt() to also return true for PIO")
+Link: https://patch.msgid.link/20240730001748.147636-1-maze@google.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/ndisc.c | 34 ++++++++++++++++++----------------
+ 1 file changed, 18 insertions(+), 16 deletions(-)
+
+diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
+index a640deb9ab14d..0961596bb085e 100644
+--- a/net/ipv6/ndisc.c
++++ b/net/ipv6/ndisc.c
+@@ -223,6 +223,7 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
+               return NULL;
+       memset(ndopts, 0, sizeof(*ndopts));
+       while (opt_len) {
++              bool unknown = false;
+               int l;
+               if (opt_len < sizeof(struct nd_opt_hdr))
+                       return NULL;
+@@ -258,22 +259,23 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
+                       break;
+ #endif
+               default:
+-                      if (ndisc_is_useropt(dev, nd_opt)) {
+-                              ndopts->nd_useropts_end = nd_opt;
+-                              if (!ndopts->nd_useropts)
+-                                      ndopts->nd_useropts = nd_opt;
+-                      } else {
+-                              /*
+-                               * Unknown options must be silently ignored,
+-                               * to accommodate future extension to the
+-                               * protocol.
+-                               */
+-                              ND_PRINTK(2, notice,
+-                                        "%s: ignored unsupported option; type=%d, len=%d\n",
+-                                        __func__,
+-                                        nd_opt->nd_opt_type,
+-                                        nd_opt->nd_opt_len);
+-                      }
++                      unknown = true;
++              }
++              if (ndisc_is_useropt(dev, nd_opt)) {
++                      ndopts->nd_useropts_end = nd_opt;
++                      if (!ndopts->nd_useropts)
++                              ndopts->nd_useropts = nd_opt;
++              } else if (unknown) {
++                      /*
++                       * Unknown options must be silently ignored,
++                       * to accommodate future extension to the
++                       * protocol.
++                       */
++                      ND_PRINTK(2, notice,
++                                "%s: ignored unsupported option; type=%d, len=%d\n",
++                                __func__,
++                                nd_opt->nd_opt_type,
++                                nd_opt->nd_opt_len);
+               }
+ next_opt:
+               opt_len -= l;
+-- 
+2.43.0
+
diff --git a/queue-4.19/net-iucv-fix-use-after-free-in-iucv_sock_close.patch b/queue-4.19/net-iucv-fix-use-after-free-in-iucv_sock_close.patch
new file mode 100644 (file)
index 0000000..fe2116f
--- /dev/null
@@ -0,0 +1,75 @@
+From 5a4401830e96563db7a1ec691caebf809a94bea1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jul 2024 14:28:16 +0200
+Subject: net/iucv: fix use after free in iucv_sock_close()
+
+From: Alexandra Winter <wintera@linux.ibm.com>
+
+[ Upstream commit f558120cd709682b739207b48cf7479fd9568431 ]
+
+iucv_sever_path() is called from process context and from bh context.
+iucv->path is used as indicator whether somebody else is taking care of
+severing the path (or it is already removed / never existed).
+This needs to be done with atomic compare and swap, otherwise there is a
+small window where iucv_sock_close() will try to work with a path that has
+already been severed and freed by iucv_callback_connrej() called by
+iucv_tasklet_fn().
+
+Example:
+[452744.123844] Call Trace:
+[452744.123845] ([<0000001e87f03880>] 0x1e87f03880)
+[452744.123966]  [<00000000d593001e>] iucv_path_sever+0x96/0x138
+[452744.124330]  [<000003ff801ddbca>] iucv_sever_path+0xc2/0xd0 [af_iucv]
+[452744.124336]  [<000003ff801e01b6>] iucv_sock_close+0xa6/0x310 [af_iucv]
+[452744.124341]  [<000003ff801e08cc>] iucv_sock_release+0x3c/0xd0 [af_iucv]
+[452744.124345]  [<00000000d574794e>] __sock_release+0x5e/0xe8
+[452744.124815]  [<00000000d5747a0c>] sock_close+0x34/0x48
+[452744.124820]  [<00000000d5421642>] __fput+0xba/0x268
+[452744.124826]  [<00000000d51b382c>] task_work_run+0xbc/0xf0
+[452744.124832]  [<00000000d5145710>] do_notify_resume+0x88/0x90
+[452744.124841]  [<00000000d5978096>] system_call+0xe2/0x2c8
+[452744.125319] Last Breaking-Event-Address:
+[452744.125321]  [<00000000d5930018>] iucv_path_sever+0x90/0x138
+[452744.125324]
+[452744.125325] Kernel panic - not syncing: Fatal exception in interrupt
+
+Note that bh_lock_sock() is not serializing the tasklet context against
+process context, because the check for sock_owned_by_user() and
+corresponding handling is missing.
+
+Ideas for a future clean-up patch:
+A) Correct usage of bh_lock_sock() in tasklet context, as described in
+Link: https://lore.kernel.org/netdev/1280155406.2899.407.camel@edumazet-laptop/
+Re-enqueue, if needed. This may require adding return values to the
+tasklet functions and thus changes to all users of iucv.
+
+B) Change iucv tasklet into worker and use only lock_sock() in af_iucv.
+
+Fixes: 7d316b945352 ("af_iucv: remove IUCV-pathes completely")
+Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
+Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
+Link: https://patch.msgid.link/20240729122818.947756-1-wintera@linux.ibm.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/iucv/af_iucv.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
+index 1ff2860dd3ffe..50725e2198f4c 100644
+--- a/net/iucv/af_iucv.c
++++ b/net/iucv/af_iucv.c
+@@ -456,8 +456,8 @@ static void iucv_sever_path(struct sock *sk, int with_user_data)
+       struct iucv_sock *iucv = iucv_sk(sk);
+       struct iucv_path *path = iucv->path;
+-      if (iucv->path) {
+-              iucv->path = NULL;
++      /* Whoever resets the path pointer, must sever and free it. */
++      if (xchg(&iucv->path, NULL)) {
+               if (with_user_data) {
+                       low_nmcpy(user_data, iucv->src_name);
+                       high_nmcpy(user_data, iucv->dst_name);
+-- 
+2.43.0
+
index 6240935f9b0d611b0973bb765e83455bc4696107..817a2d67049ab73ca52a045aa30dccd6a3edab3a 100644 (file)
@@ -120,3 +120,6 @@ perf-x86-intel-pt-fix-a-topa_entry-base-address-calc.patch
 remoteproc-imx_rproc-ignore-mapping-vdev-regions.patch
 remoteproc-imx_rproc-fix-ignoring-mapping-vdev-regio.patch
 remoteproc-imx_rproc-skip-over-memory-region-when-no.patch
+drm-vmwgfx-fix-overlay-when-using-screen-targets.patch
+net-iucv-fix-use-after-free-in-iucv_sock_close.patch
+ipv6-fix-ndisc_is_useropt-handling-for-pio.patch