Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock X-Debbugs-Cc: jcris...@debian.org
Please unblock package xwayland [ Reason ] CVE-2023-1393 [ Risks ] Arguably we could have cherry-picked just the CVE fix but the rest seems reasonably low-risk too, so might as well throw in the extra fixes. [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing [ Other info ] Upstream changelog from 22.1.8 (currently in testing) follows. All changes are reasonably straightforward and self-contained. > commit f44cdcf4660ff70ee0dc9dc1f07ea31f8548837e > Author: Olivier Fourdan <ofour...@redhat.com> > Date: Wed Mar 29 14:00:14 2023 +0200 > > Bump version to 22.1.9 > > Signed-off-by: Olivier Fourdan <ofour...@redhat.com> > > meson.build | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > commit b3d05255dd1e8ece1636fb07b9461122273785ee > Author: Olivier Fourdan <ofour...@redhat.com> > Date: Mon Mar 13 11:08:47 2023 +0100 > > composite: Fix use-after-free of the COW > > ZDI-CAN-19866/CVE-2023-1393 > > If a client explicitly destroys the compositor overlay window (aka COW), > we would leave a dangling pointer to that window in the CompScreen > structure, which will trigger a use-after-free later. > > Make sure to clear the CompScreen pointer to the COW when the latter gets > destroyed explicitly by the client. > > This vulnerability was discovered by: > Jan-Niklas Sohn working with Trend Micro Zero Day Initiative > > Signed-off-by: Olivier Fourdan <ofour...@redhat.com> > Reviewed-by: Adam Jackson <a...@redhat.com> > (cherry picked from commit 26ef545b3502f61ca722a7a3373507e88ef64110) > > composite/compwindow.c | 5 +++++ > 1 file changed, 5 insertions(+) > > commit 809cbedb969f10754ef866f71395c7b89968b2d5 > Author: Benno Schulenberg <bensb...@telfort.nl> > Date: Mon Mar 27 20:03:56 2023 +0200 > > xkbUtils: use existing symbol names instead of deleted deprecated ones > > Symbols `XK_Cyrillic_DZHE` and `XK_Serbian_DZE` were pure synonyms. > > (cherry picked from commit 6153c71cfb4698f1a416266564ecc748e4a25f2c) > > xkb/xkbUtils.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > commit 9e52a28be8aa763e1005f05affc7cef3c4219989 > Author: Olivier Fourdan <ofour...@redhat.com> > Date: Wed Mar 22 11:31:03 2023 +0100 > > test: Use either wayland-info or weston-info > > weston-info has been deprecated for quite some time, whereas wayland-info > may not be available yet. > > So we use either, depending on what's actually available. > > Signed-off-by: Olivier Fourdan <ofour...@redhat.com> > Reviewed-by: Michel Dänzer <mdaen...@redhat.com> > (cherry picked from commit fc625fe172d9f6a149a594b5214364bedf680239) > > test/scripts/xwayland-piglit.sh | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > commit d2e27b0a8c05efe56a4179d053c0258f95d3772f > Author: Joshua Ashton <jos...@froggi.es> > Date: Fri Mar 17 12:31:44 2023 +0000 > > glamor: Don't glFlush/ctx switch unless any work has been performed > > `glamor_make_current` is always called before any calls to GL. > > Apply some dirty-tracking to whenever we call `glamor_make_current` so > that we can avoid a decent amount of redundant GL work on each > Dispatch cycle. > > Gamescope previously was waking up an empty Xwayland server with an > XQueryPointer and I noticed a significant amount of churn doing > redundant GL work. > > This has been addressed on the Gamescope side as well, but avoiding any > useless GL context switches and flushes when glamor is doing nothing > is still beneficial for CPU and power usage on portable devices. > > Signed-off-by: Joshua Ashton <jos...@froggi.es> > Reviewed-by: Emma Anholt <e...@anholt.net> > Acked-by: Olivier Fourdan <ofour...@redhat.com > (cherry picked from commit 89163917e1976db4ae4863ad5337fa14bf348081) > > glamor/glamor.c | 7 ++----- > glamor/glamor_priv.h | 1 + > glamor/glamor_sync.c | 3 +-- > glamor/glamor_utils.h | 11 +++++++++++ > 4 files changed, 15 insertions(+), 7 deletions(-) > > commit 667afc6f8db59b1da6af5afe74709978496eebf0 > Author: Adam Jackson <a...@redhat.com> > Date: Thu Feb 2 12:26:27 2023 -0500 > > present: Send a PresentConfigureNotify event for destroyed windows > > This enables fixing a deadlock case on the client side, where the client > ends up blocked waiting for a Present event that will never come because > the window was destroyed. The new PresentWindowDestroyed flag allows the > client to avoid blocking indefinitely. > > Signed-off-by: Adam Jackson <a...@redhat.com> > See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/116 > See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6685 > Reviewed-by: Michel Dänzer <mdaen...@redhat.com> > (cherry picked from commit 462b06033e66a32308d940eb5fc47f5e4c914dc0) > > present/present_event.c | 5 +++-- > present/present_priv.h | 7 ++++++- > present/present_screen.c | 11 ++++++++++- > 3 files changed, 19 insertions(+), 4 deletions(-) > > commit f05528524613c1b2ea67fd45d45e84c319a5d6bd > Author: Minh Phan <phanquangminh...@gmail.com> > Date: Sun Feb 5 14:38:32 2023 +0700 > > xwayland/window: Do not double add window to damage list > > The window might be retained in the damage list after > `xwl_screen_post_damage` in certain conditions. This means we need to > check if the window is already in the list to avoid adding the same > window twice which will lead to list corruption resulting in server freeze > in `xwl_screen_post_damage`. > > Signed-off-by: Minh Phan <phanquangminh...@gmail.com> > (cherry picked from commit ba644a64a415962956de72936d21b6527ee8cd57) > > hw/xwayland/xwayland-window.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > commit 700ddafe0ccd1de1e95900f50aef3c20782369b0 > Author: Olivier Fourdan <ofour...@redhat.com> > Date: Thu Feb 9 11:40:07 2023 +0100 > > dix: Clear device sprite after free in AttachDevice() > > The code in AttachDevice() may free the dev->spriteInfo->sprite under > some circumstances and later call GetCurrentRootWindow() which uses > the same dev->spriteInfo->sprite. > > While it seems unlikely that this is actually an issue, considering the > cases where one or the other get called, it still makes the code look > suspicious. > > Make sure to clear set dev->spriteInfo->sprite to NULL immediately > after it's freed to avoid any confusion, even if only to clarify the > code. > > Signed-off-by: Olivier Fourdan <ofour...@redhat.com> > Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1436 > (cherry picked from commit e196535abbf2ef4aa7c1eb0b4b9b67840032b88a) > > dix/devices.c | 1 + > 1 file changed, 1 insertion(+) > > commit b2b3f67e09007f38af2066a076678da9e90449e8 > Author: Ivan A. Melnikov <i...@altlinux.org> > Date: Wed Dec 21 18:29:21 2022 +0400 > > glamor: Don't initialize on softpipe > > There are systems where softpipe is the default renderer, > e.g. when llvmpipe is not is not available. Using glamor > on such systems is never a good idea. > > This mirrors what commit 0a9415cf793babed1f28c61f8047d51de04f1528 > did for llvmpipe. > > Closes: #1417 > > Signed-off-by: Ivan A. Melnikov <i...@altlinux.org> > (cherry picked from commit 711d491729d83b17114fd08d784bc0ddfd17ff6a) > > glamor/glamor_egl.c | 5 +++++ > hw/xwayland/xwayland-glamor-gbm.c | 4 ++++ > 2 files changed, 9 insertions(+) > > commit e910626d37eb0030bf38d8595414e97e465e927a > Author: Joshua Ashton <jos...@froggi.es> > Date: Thu Dec 29 08:05:19 2022 +0000 > > xwayland: Don't expose XRandR emulated modes for leaseable displays > > Leasable displays do not have any actual associated Wayland output and > are not available to regular X11 clients and left entirely to the > application who requests the lease. > > As these are not actually managed by the Wayland compositor and left > entirely to the "lessee" application, the viewporter protocol required > for the XRandR emulation is not usable on such devices. > > We should therefore not advertise the XRandR emulated modes for those > leasable displays. > > This also solves a problem with implementations of glXGetMscRateOML() > which is used notably by Chromium/Electron. Applications using this > which will begin lagging/stuttering exponentially over > time, trying to look up a non-existent mode with 0x0 as returned by > XF86VidModeGetModeLine() with XRandR emulation for such devices. > > See-also: https://github.com/labwc/labwc/issues/553 > Signed-off-by: Joshua Ashton <jos...@froggi.es> > (cherry picked from commit 0abb5770750e54566d3ce14a3be9dbf15bb578ba) > > hw/xwayland/xwayland-output.c | 4 ++++ > 1 file changed, 4 insertions(+) > > commit 6c2c2a2437d60c29ab2d2d7d8f7fa58a323880e9 > Author: Minh Phan <phanquangminh...@gmail.com> > Date: Tue Nov 29 19:37:22 2022 +0700 > > xwayland/output: properly return the current emulated mode when queried > > This fixes an issue with GLFW-based games failing to set the resolution > when the user request to switch back to the native display mode. > > Signed-off-by: Minh Phan <phanquangminh...@gmail.com> > Acked-by: Olivier Fourdan <ofour...@redhat.com> > (cherry picked from commit 511d1686a6ac3e3e0d66fb67b62620ba2a6575c8) > > hw/xwayland/xwayland-output.c | 16 ++++++++++++++++ > hw/xwayland/xwayland-output.h | 1 + > 2 files changed, 17 insertions(+) > > commit 7d039914ff5baf1ebd5dca1ddcb8d3a74ba3587e > Author: Minh Phan <phanquangminh...@gmail.com> > Date: Tue Nov 29 19:35:13 2022 +0700 > > randr: introduce rrCrtcGetInfo DDX function > > This allows rrCrtcGetInfo to override the values in the XRRCrtcGetInfo > reply. One use case is to allow Xwayland to return the current emulated > mode for the specific client instead of the global mode. > > Signed-off-by: Minh Phan <phanquangminh...@gmail.com> > Acked-by: Olivier Fourdan <ofour...@redhat.com> > (cherry picked from commit 5145742fb6e3d108b05db1521b51112e0dbfb95a) > > randr/randrstr.h | 8 ++++++++ > randr/rrcrtc.c | 3 +++ > 2 files changed, 11 insertions(+) > > commit cedf933c7cbbc0285e7f9ddb17706b9a8d84f6aa > Author: Doğukan Korkmaztürk <dkorkmazt...@nvidia.com> > Date: Tue Nov 22 13:43:16 2022 -0500 > > GLX: Free the tag of the old context later > > In CommonMakeCurrent() function, the tag of the old context is freed > before the new context is made current. This is problematic because if > the CommonMakeNewCurrent() function fails, the tag of the old context > ends up being removed, even though it is still active. This causes > subsequent glXMakeCurrent() or glXMakeContextCurrent() requests to > generate a GLXBadContextTag error. > > This change moves the function call that frees the old tag to a location > where the result of CommonMakeNewCurrent() call is known and it is safe > to free it. > > Signed-off-by: Doğukan Korkmaztürk <dkorkmazt...@nvidia.com> > (cherry picked from commit 4781f2a5a8c2c2b000374e2d87982a6701d5a6b3) > > glx/vndcmds.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > commit e982ca4420a6003c97cb076ee40172e904ce290a > Author: Doğukan Korkmaztürk <dkorkmazt...@nvidia.com> > Date: Tue Nov 8 10:05:59 2022 -0500 > > xwayland/glx: Mirror all EGLConfigs > > Updated the for-loop that iterates over the received EGLConfigs to > include the very first EGLConfig with index 0. > > Signed-off-by: Doğukan Korkmaztürk <dkorkmazt...@nvidia.com> > Fixes: 8469241592 - xwayland: Add EGL-backed GLX provider > (cherry picked from commit 3852b0d10a061348ea8214fbcbef3c5c08cac0b6) > > hw/xwayland/xwayland-glx.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > commit 4303ddfbf98023f33c1067007543df345c68b459 > Author: Corentin Noël <corentin.n...@collabora.com> > Date: Mon Aug 1 16:03:38 2022 +0200 > > glamor: Only check for llvmpipe renderer > > The virgl driver exposes the name of the host renderer which might be > llvmpipe. > In this case we still need glamor to be initialized. > > Only check if the renderer starts with llvmpipe (which is what llvmpipe > exposes). > > Signed-off-by: Corentin Noël <corentin.n...@collabora.com> > Reviewed-by: Adam Jackson <a...@redhat.com> > (cherry picked from commit fdebbc60d89cdc1b3353424b6568b25a61dcf372) > > glamor/glamor_egl.c | 2 +- > hw/xwayland/xwayland-glamor-gbm.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > commit bc288f59a4d6bf5e713f1473e42d9cdb20d879bf > Author: Lucas Stach <l.st...@pengutronix.de> > Date: Sun Jul 10 17:51:14 2022 +0200 > > xwayland: properly get FDs from multiplanar GBM BOs > > Multiplanar GBM buffers can point to different objects from each plane. > Use the _for_plane API when possible to retrieve the correct prime FD > for each plane. > > Signed-off-by: Lucas Stach <l.st...@pengutronix.de> > Reviewed-by: Simon Ser <cont...@emersion.fr> > Tested-by: Guido Günther <a...@sigxcpu.org> > (cherry picked from commit 7d5ad2d372cc88648f6744c318a4bee18443689d) > > hw/xwayland/xwayland-glamor-gbm.c | 66 > +++++++++++++++++++++++++++++++++------ > 1 file changed, 57 insertions(+), 9 deletions(-) > > commit 57db30e637192df0600999cd40ec14edbeb1c68a > Author: Lucas Stach <l.st...@pengutronix.de> > Date: Thu Jul 28 22:44:59 2022 +0200 > > xwayland: handle fd export failure in glamor_egl_fds_from_pixmap > > Check the fd for validity before giving a success return code. > > Signed-off-by: Lucas Stach <l.st...@pengutronix.de> > Reviewed-by: Simon Ser <cont...@emersion.fr> > Tested-by: Guido Günther <a...@sigxcpu.org> > (cherry picked from commit 951502e49797ab4c5db047e9df32c93d050d64af) > > hw/xwayland/xwayland-glamor-gbm.c | 7 +++++++ > 1 file changed, 7 insertions(+) unblock xwayland/2:22.1.9-1
diff -Nru xwayland-22.1.8/composite/compwindow.c xwayland-22.1.9/composite/compwindow.c --- xwayland-22.1.8/composite/compwindow.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/composite/compwindow.c 2023-03-29 14:22:52.000000000 +0200 @@ -620,6 +620,11 @@ ret = (*pScreen->DestroyWindow) (pWin); cs->DestroyWindow = pScreen->DestroyWindow; pScreen->DestroyWindow = compDestroyWindow; + + /* Did we just destroy the overlay window? */ + if (pWin == cs->pOverlayWin) + cs->pOverlayWin = NULL; + /* compCheckTree (pWin->drawable.pScreen); can't check -- tree isn't good*/ return ret; } diff -Nru xwayland-22.1.8/debian/changelog xwayland-22.1.9/debian/changelog --- xwayland-22.1.8/debian/changelog 2023-02-07 14:14:38.000000000 +0100 +++ xwayland-22.1.9/debian/changelog 2023-03-29 15:23:04.000000000 +0200 @@ -1,3 +1,10 @@ +xwayland (2:22.1.9-1) unstable; urgency=high + + * New upstream bugfix release + - composite: Fix use-after-free of the COW (CVE-2023-1393) + + -- Julien Cristau <jcris...@debian.org> Wed, 29 Mar 2023 15:23:04 +0200 + xwayland (2:22.1.8-1) unstable; urgency=medium * New upstream release. diff -Nru xwayland-22.1.8/dix/devices.c xwayland-22.1.9/dix/devices.c --- xwayland-22.1.8/dix/devices.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/dix/devices.c 2023-03-29 14:22:52.000000000 +0200 @@ -2627,6 +2627,7 @@ screen = miPointerGetScreen(dev); screen->DeviceCursorCleanup(dev, screen); free(dev->spriteInfo->sprite); + dev->spriteInfo->sprite = NULL; } dev->master = master; diff -Nru xwayland-22.1.8/glamor/glamor.c xwayland-22.1.9/glamor/glamor.c --- xwayland-22.1.8/glamor/glamor.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glamor/glamor.c 2023-03-29 14:22:52.000000000 +0200 @@ -271,9 +271,7 @@ glamor_block_handler(ScreenPtr screen) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - - glamor_make_current(glamor_priv); - glFlush(); + glamor_flush(glamor_priv); } static void @@ -281,8 +279,7 @@ { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_make_current(glamor_priv); - glFlush(); + glamor_flush(glamor_priv); screen->BlockHandler = glamor_priv->saved_procs.block_handler; screen->BlockHandler(screen, timeout); diff -Nru xwayland-22.1.8/glamor/glamor_egl.c xwayland-22.1.9/glamor/glamor_egl.c --- xwayland-22.1.8/glamor/glamor_egl.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glamor/glamor_egl.c 2023-03-29 14:22:52.000000000 +0200 @@ -1053,7 +1053,12 @@ "glGetString() returned NULL, your GL is broken\n"); goto error; } - if (strstr((const char *)renderer, "llvmpipe")) { + if (strstr((const char *)renderer, "softpipe")) { + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "Refusing to try glamor on softpipe\n"); + goto error; + } + if (!strncmp("llvmpipe", (const char *)renderer, strlen("llvmpipe"))) { if (scrn->confScreen->num_gpu_devices) xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allowing glamor on llvmpipe for PRIME\n"); diff -Nru xwayland-22.1.8/glamor/glamor_priv.h xwayland-22.1.9/glamor/glamor_priv.h --- xwayland-22.1.8/glamor/glamor_priv.h 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glamor/glamor_priv.h 2023-03-29 14:22:52.000000000 +0200 @@ -313,6 +313,7 @@ Bool suppress_gl_out_of_memory_logging; Bool logged_any_fbo_allocation_failure; Bool logged_any_pbo_allocation_failure; + Bool dirty; /* xv */ glamor_program xv_prog; diff -Nru xwayland-22.1.8/glamor/glamor_sync.c xwayland-22.1.9/glamor/glamor_sync.c --- xwayland-22.1.8/glamor/glamor_sync.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glamor/glamor_sync.c 2023-03-29 14:22:52.000000000 +0200 @@ -52,8 +52,7 @@ struct glamor_sync_fence *glamor_fence = glamor_get_sync_fence(fence); /* Flush pending rendering operations */ - glamor_make_current(glamor); - glFlush(); + glamor_flush(glamor); fence->funcs.SetTriggered = glamor_fence->set_triggered; fence->funcs.SetTriggered(fence); diff -Nru xwayland-22.1.8/glamor/glamor_utils.h xwayland-22.1.9/glamor/glamor_utils.h --- xwayland-22.1.8/glamor/glamor_utils.h 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glamor/glamor_utils.h 2023-03-29 14:22:52.000000000 +0200 @@ -672,6 +672,17 @@ lastGLContext = glamor_priv->ctx.ctx; glamor_priv->ctx.make_current(&glamor_priv->ctx); } + glamor_priv->dirty = TRUE; +} + +static inline void +glamor_flush(glamor_screen_private *glamor_priv) +{ + if (glamor_priv->dirty) { + glamor_make_current(glamor_priv); + glFlush(); + glamor_priv->dirty = FALSE; + } } static inline BoxRec diff -Nru xwayland-22.1.8/glx/vndcmds.c xwayland-22.1.9/glx/vndcmds.c --- xwayland-22.1.8/glx/vndcmds.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/glx/vndcmds.c 2023-03-29 14:22:52.000000000 +0200 @@ -165,9 +165,6 @@ tagInfo->tag, // No old context tag, None, None, None, 0); - if (ret == Success) { - GlxFreeContextTag(tagInfo); - } return ret; } @@ -259,7 +256,6 @@ if (ret != Success) { return ret; } - oldTag = NULL; } if (newVendor != NULL) { @@ -270,6 +266,9 @@ } else { reply.contextTag = 0; } + + GlxFreeContextTag(oldTag); + oldTag = NULL; } reply.contextTag = GlxCheckSwap(client, reply.contextTag); diff -Nru xwayland-22.1.8/hw/xwayland/xwayland-glamor-gbm.c xwayland-22.1.9/hw/xwayland/xwayland-glamor-gbm.c --- xwayland-22.1.8/hw/xwayland/xwayland-glamor-gbm.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/hw/xwayland/xwayland-glamor-gbm.c 2023-03-29 14:22:52.000000000 +0200 @@ -354,12 +354,15 @@ unsigned short width = pixmap->drawable.width; unsigned short height = pixmap->drawable.height; uint32_t format; - int prime_fd; int num_planes; + int prime_fds[4]; uint32_t strides[4]; uint32_t offsets[4]; uint64_t modifier; int i; +#ifndef GBM_BO_FD_FOR_PLANE + int32_t first_handle; +#endif if (xwl_pixmap == NULL) return NULL; @@ -374,20 +377,43 @@ format = wl_drm_format_for_depth(pixmap->drawable.depth); - prime_fd = gbm_bo_get_fd(xwl_pixmap->bo); - if (prime_fd == -1) - return NULL; - #ifdef GBM_BO_WITH_MODIFIERS num_planes = gbm_bo_get_plane_count(xwl_pixmap->bo); modifier = gbm_bo_get_modifier(xwl_pixmap->bo); for (i = 0; i < num_planes; i++) { +#ifdef GBM_BO_FD_FOR_PLANE + prime_fds[i] = gbm_bo_get_fd_for_plane(xwl_pixmap->bo, i); +#else + union gbm_bo_handle plane_handle; + + plane_handle = gbm_bo_get_handle_for_plane(xwl_pixmap->bo, i); + if (i == 0) + first_handle = plane_handle.s32; + + /* If all planes point to the same object as the first plane, i.e. they + * all have the same handle, we can fall back to the non-planar + * gbm_bo_get_fd without losing information. If they point to different + * objects we are out of luck and need to give up. + */ + if (first_handle == plane_handle.s32) + prime_fds[i] = gbm_bo_get_fd(xwl_pixmap->bo); + else + prime_fds[i] = -1; +#endif + if (prime_fds[i] == -1) { + while (--i >= 0) + close(prime_fds[i]); + return NULL; + } strides[i] = gbm_bo_get_stride_for_plane(xwl_pixmap->bo, i); offsets[i] = gbm_bo_get_offset(xwl_pixmap->bo, i); } #else num_planes = 1; modifier = DRM_FORMAT_MOD_INVALID; + prime_fds[0] = gbm_bo_get_fd(xwl_pixmap->bo); + if (prime_fds[0] == -1) + return NULL; strides[0] = gbm_bo_get_stride(xwl_pixmap->bo); offsets[0] = 0; #endif @@ -398,7 +424,7 @@ params = zwp_linux_dmabuf_v1_create_params(xwl_screen->dmabuf); for (i = 0; i < num_planes; i++) { - zwp_linux_buffer_params_v1_add(params, prime_fd, i, + zwp_linux_buffer_params_v1_add(params, prime_fds[i], i, offsets[i], strides[i], modifier >> 32, modifier & 0xffffffff); } @@ -409,14 +435,15 @@ zwp_linux_buffer_params_v1_destroy(params); } else if (num_planes == 1) { xwl_pixmap->buffer = - wl_drm_create_prime_buffer(xwl_gbm->drm, prime_fd, width, height, + wl_drm_create_prime_buffer(xwl_gbm->drm, prime_fds[0], width, height, format, 0, gbm_bo_get_stride(xwl_pixmap->bo), 0, 0, 0, 0); } - close(prime_fd); + for (i = 0; i < num_planes; i++) + close(prime_fds[i]); /* Add our listener now */ wl_buffer_add_listener(xwl_pixmap->buffer, @@ -610,6 +637,9 @@ { struct xwl_pixmap *xwl_pixmap; #ifdef GBM_BO_WITH_MODIFIERS +#ifndef GBM_BO_FD_FOR_PLANE + int32_t first_handle; +#endif uint32_t num_fds; int i; #endif @@ -627,7 +657,30 @@ *modifier = gbm_bo_get_modifier(xwl_pixmap->bo); for (i = 0; i < num_fds; i++) { - fds[i] = gbm_bo_get_fd(xwl_pixmap->bo); +#ifdef GBM_BO_FD_FOR_PLANE + fds[i] = gbm_bo_get_fd_for_plane(xwl_pixmap->bo, i); +#else + union gbm_bo_handle plane_handle; + + plane_handle = gbm_bo_get_handle_for_plane(xwl_pixmap->bo, i); + if (i == 0) + first_handle = plane_handle.s32; + + /* If all planes point to the same object as the first plane, i.e. they + * all have the same handle, we can fall back to the non-planar + * gbm_bo_get_fd without losing information. If they point to different + * objects we are out of luck and need to give up. + */ + if (first_handle == plane_handle.s32) + fds[i] = gbm_bo_get_fd(xwl_pixmap->bo); + else + fds[i] = -1; +#endif + if (fds[i] == -1) { + while (--i >= 0) + close(fds[i]); + return 0; + } strides[i] = gbm_bo_get_stride_for_plane(xwl_pixmap->bo, i); offsets[i] = gbm_bo_get_offset(xwl_pixmap->bo, i); } @@ -636,6 +689,8 @@ #else *modifier = DRM_FORMAT_MOD_INVALID; fds[0] = gbm_bo_get_fd(xwl_pixmap->bo); + if (fds[0] == -1) + return 0; strides[0] = gbm_bo_get_stride(xwl_pixmap->bo); offsets[0] = 0; return 1; @@ -975,7 +1030,11 @@ ErrorF("glGetString() returned NULL, your GL is broken\n"); goto error; } - if (strstr((const char *)renderer, "llvmpipe")) { + if (strstr((const char *)renderer, "softpipe")) { + ErrorF("Refusing to try glamor on softpipe\n"); + goto error; + } + if (!strncmp("llvmpipe", (const char *)renderer, strlen("llvmpipe"))) { ErrorF("Refusing to try glamor on llvmpipe\n"); goto error; } diff -Nru xwayland-22.1.8/hw/xwayland/xwayland-glx.c xwayland-22.1.9/hw/xwayland/xwayland-glx.c --- xwayland-22.1.8/hw/xwayland/xwayland-glx.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/hw/xwayland/xwayland-glx.c 2023-03-29 14:22:52.000000000 +0200 @@ -339,7 +339,7 @@ /* We walk the EGL configs backwards to make building the * ->next chain easier. */ - for (i = nconfigs - 1; i > 0; i--) + for (i = nconfigs - 1; i >= 0; i--) for (j = 0; j < 3; j++) /* direct_color */ for (k = 0; k < 2; k++) /* double_buffer */ { if (can_srgb) diff -Nru xwayland-22.1.8/hw/xwayland/xwayland-output.c xwayland-22.1.9/hw/xwayland/xwayland-output.c --- xwayland-22.1.8/hw/xwayland/xwayland-output.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/hw/xwayland/xwayland-output.c 2023-03-29 14:22:52.000000000 +0200 @@ -223,6 +223,10 @@ if (!xwl_output) return NULL; + /* We don't do XRandr emulation when a fake lease display */ + if (!xwl_output->output) + return NULL; + for (i = 0; i < XWL_CLIENT_MAX_EMULATED_MODES; i++) { if (xwl_client->emulated_modes[i].server_output_id == xwl_output->server_output_id) @@ -266,6 +270,7 @@ emulated_mode->server_output_id = xwl_output->server_output_id; emulated_mode->width = mode->mode.width; emulated_mode->height = mode->mode.height; + emulated_mode->id = mode->mode.id; emulated_mode->from_vidmode = from_vidmode; } @@ -902,6 +907,20 @@ return TRUE; } +static void +xwl_randr_crtc_get(ScreenPtr pScreen, + RRCrtcPtr crtc, + xRRGetCrtcInfoReply *rep) +{ + struct xwl_output *xwl_output = crtc->devPrivate; + + struct xwl_emulated_mode *mode = xwl_output_get_emulated_mode_for_client( + xwl_output, GetCurrentClient()); + + if (mode) + rep->mode = mode->id; +} + static Bool xwl_randr_crtc_set_gamma(ScreenPtr pScreen, RRCrtcPtr crtc) { @@ -962,6 +981,7 @@ #if RANDR_12_INTERFACE rp->rrScreenSetSize = xwl_randr_screen_set_size; rp->rrCrtcSet = xwl_randr_crtc_set; + rp->rrCrtcGet = xwl_randr_crtc_get; rp->rrCrtcSetGamma = xwl_randr_crtc_set_gamma; rp->rrCrtcGetGamma = xwl_randr_crtc_get_gamma; rp->rrOutputSetProperty = xwl_randr_output_set_property; diff -Nru xwayland-22.1.8/hw/xwayland/xwayland-output.h xwayland-22.1.9/hw/xwayland/xwayland-output.h --- xwayland-22.1.8/hw/xwayland/xwayland-output.h 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/hw/xwayland/xwayland-output.h 2023-03-29 14:22:52.000000000 +0200 @@ -69,6 +69,7 @@ uint32_t server_output_id; int32_t width; int32_t height; + RRMode id; Bool from_vidmode; }; diff -Nru xwayland-22.1.8/hw/xwayland/xwayland-window.c xwayland-22.1.9/hw/xwayland/xwayland-window.c --- xwayland-22.1.8/hw/xwayland/xwayland-window.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/hw/xwayland/xwayland-window.c 2023-03-29 14:22:52.000000000 +0200 @@ -175,7 +175,8 @@ } #endif - xorg_list_add(&xwl_window->link_damage, &xwl_screen->damage_window_list); + if (xorg_list_is_empty(&xwl_window->link_damage)) + xorg_list_add(&xwl_window->link_damage, &xwl_screen->damage_window_list); } static void diff -Nru xwayland-22.1.8/meson.build xwayland-22.1.9/meson.build --- xwayland-22.1.8/meson.build 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/meson.build 2023-03-29 14:22:52.000000000 +0200 @@ -3,10 +3,10 @@ 'buildtype=debugoptimized', 'c_std=gnu99', ], - version: '22.1.8', + version: '22.1.9', meson_version: '>= 0.47.0', ) -release_date = '2023-02-07' +release_date = '2023-03-29' add_project_arguments('-DHAVE_DIX_CONFIG_H', language: ['c', 'objc']) cc = meson.get_compiler('c') diff -Nru xwayland-22.1.8/present/present_event.c xwayland-22.1.9/present/present_event.c --- xwayland-22.1.8/present/present_event.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/present/present_event.c 2023-03-29 14:22:52.000000000 +0200 @@ -102,7 +102,8 @@ } void -present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling) +present_send_config_notify(WindowPtr window, int x, int y, int w, int h, + int bw, WindowPtr sibling, CARD32 flags) { present_window_priv_ptr window_priv = present_window_priv(window); @@ -122,7 +123,7 @@ .off_y = 0, .pixmap_width = w, .pixmap_height = h, - .pixmap_flags = 0 + .pixmap_flags = flags }; present_event_ptr event; diff -Nru xwayland-22.1.8/present/present_priv.h xwayland-22.1.9/present/present_priv.h --- xwayland-22.1.8/present/present_priv.h 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/present/present_priv.h 2023-03-29 14:22:52.000000000 +0200 @@ -43,6 +43,11 @@ #define DebugPresent(x) #endif +/* XXX this belongs in presentproto */ +#ifndef PresentWindowDestroyed +#define PresentWindowDestroyed (1 << 0) +#endif + extern int present_request; extern DevPrivateKeyRec present_screen_private_key; @@ -307,7 +312,7 @@ present_free_events(WindowPtr window); void -present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling); +present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling, CARD32 flags); void present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc); diff -Nru xwayland-22.1.8/present/present_screen.c xwayland-22.1.9/present/present_screen.c --- xwayland-22.1.8/present/present_screen.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/present/present_screen.c 2023-03-29 14:22:52.000000000 +0200 @@ -93,6 +93,15 @@ present_screen_priv_ptr screen_priv = present_screen_priv(screen); present_window_priv_ptr window_priv = present_window_priv(window); + present_send_config_notify(window, + window->drawable.x, + window->drawable.y, + window->drawable.width, + window->drawable.height, + window->borderWidth, + window->nextSib, + PresentWindowDestroyed); + if (window_priv) { present_clear_window_notifies(window); present_free_events(window); @@ -123,7 +132,7 @@ ScreenPtr screen = window->drawable.pScreen; present_screen_priv_ptr screen_priv = present_screen_priv(screen); - present_send_config_notify(window, x, y, w, h, bw, sibling); + present_send_config_notify(window, x, y, w, h, bw, sibling, 0); unwrap(screen_priv, screen, ConfigNotify); if (screen->ConfigNotify) diff -Nru xwayland-22.1.8/randr/randrstr.h xwayland-22.1.9/randr/randrstr.h --- xwayland-22.1.8/randr/randrstr.h 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/randr/randrstr.h 2023-03-29 14:22:52.000000000 +0200 @@ -218,6 +218,10 @@ Rotation rotation, int numOutputs, RROutputPtr * outputs); +typedef void (*RRCrtcGetProcPtr) (ScreenPtr pScreen, + RRCrtcPtr crtc, + xRRGetCrtcInfoReply *rep); + typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); @@ -420,6 +424,10 @@ RRRequestLeaseProcPtr rrRequestLease; RRGetLeaseProcPtr rrGetLease; + +#if RANDR_12_INTERFACE + RRCrtcGetProcPtr rrCrtcGet; +#endif } rrScrPrivRec, *rrScrPrivPtr; extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec; diff -Nru xwayland-22.1.8/randr/rrcrtc.c xwayland-22.1.9/randr/rrcrtc.c --- xwayland-22.1.8/randr/rrcrtc.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/randr/rrcrtc.c 2023-03-29 14:22:52.000000000 +0200 @@ -1269,6 +1269,9 @@ } } + if (pScrPriv->rrCrtcGet) + pScrPriv->rrCrtcGet(pScreen, crtc, &rep); + if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); diff -Nru xwayland-22.1.8/test/scripts/xwayland-piglit.sh xwayland-22.1.9/test/scripts/xwayland-piglit.sh --- xwayland-22.1.8/test/scripts/xwayland-piglit.sh 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/test/scripts/xwayland-piglit.sh 2023-03-29 14:22:52.000000000 +0200 @@ -17,8 +17,13 @@ WESTON_PID=$! export WAYLAND_DISPLAY=wayland-$$ +# We can use either wayland-info or weston-info (deprecated), depending +# on what's actually available. +WAYLAND_INFO=wayland-info +command -V $WAYLAND_INFO >/dev/null 2>&1 || WAYLAND_INFO=weston-info + # Wait for weston to initialize before starting Xwayland -timeout --preserve-status 60s bash -c 'while ! weston-info &>/dev/null; do sleep 1; done' +timeout --preserve-status 60s bash -c "while ! $WAYLAND_INFO &>/dev/null; do sleep 1; done" # Start an Xwayland server export PIGLIT_RESULTS_DIR=$XSERVER_BUILDDIR/test/piglit-results/xwayland diff -Nru xwayland-22.1.8/xkb/xkbUtils.c xwayland-22.1.9/xkb/xkbUtils.c --- xwayland-22.1.8/xkb/xkbUtils.c 2023-02-07 08:30:43.000000000 +0100 +++ xwayland-22.1.9/xkb/xkbUtils.c 2023-03-29 14:22:52.000000000 +0200 @@ -902,9 +902,9 @@ break; case 6: /* Cyrillic */ /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE) + if (sym >= XK_Serbian_DJE && sym <= XK_Cyrillic_DZHE) *lower -= (XK_Serbian_DJE - XK_Serbian_dje); - else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze) + else if (sym >= XK_Serbian_dje && sym <= XK_Cyrillic_dzhe) *upper += (XK_Serbian_DJE - XK_Serbian_dje); else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN) *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);