Hello community,

here is the log from the commit of package xorg-x11-server for openSUSE:Factory 
checked in at 2020-12-09 22:11:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xorg-x11-server (Old)
 and      /work/SRC/openSUSE:Factory/.xorg-x11-server.new.2328 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xorg-x11-server"

Wed Dec  9 22:11:39 2020 rev:389 rq:853611 version:1.20.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/xorg-x11-server/xorg-x11-server.changes  
2020-12-03 18:43:05.690186707 +0100
+++ 
/work/SRC/openSUSE:Factory/.xorg-x11-server.new.2328/xorg-x11-server.changes    
    2020-12-09 22:11:41.903083890 +0100
@@ -1,0 +2,44 @@
+Mon Dec 07 13:48:26 UTC 2020 - tobias.klausm...@freenet.de
+
+- Update to version 1.20.10:
+  * Check SetMap request length carefully.
+  * Fix XkbSetDeviceInfo() and SetDeviceIndicators() heap overflows
+  * present/wnmd: Translate update region to screen space
+  * modesetting: keep going if a modeset fails on EnterVT
+  * modesetting: check the kms state on EnterVT
+  * configure: Build hashtable for Xres and glvnd
+  * xwayland: Create an xwl_window for toplevel only
+  * xwayland: non-rootless requires the wl_shell protocol
+  * glamor: Update pixmap's devKind when making it exportable
+  * os: Fix instruction pointer written in xorg_backtrace
+  * present/wnmd: Execute copies at target_msc-1 already
+  * present/wnmd: Move up present_wnmd_queue_vblank
+  * present: Add present_vblank::exec_msc field
+  * present: Move flip target_msc adjustment out of present_vblank_create
+  * xwayland: Remove pending stream reference when freeing
+  * xwayland: use drmGetNodeTypeFromFd for checking if a node is a render one
+  * xwayland: Do not discard frame callbacks on allow commits
+  * present/wnmd: Remove dead check from present_wnmd_check_flip
+  * xwayland: Check window pixmap in xwl_present_check_flip2
+  * present/wnmd: Can't use page flipping for windows clipped by children
+  * xfree86: Take second reference for SavedCursor in xf86CursorSetCursor
+  * glamor: Fix glamor_poly_fill_rect_gl xRectangle::width/height handling
+  * include: Increase the number of max. input devices to 256.
+  * Revert "linux: Make platform device probe less fragile"
+  * Revert "linux: Fix platform device PCI detection for complex bus 
topologies"
+  * Revert "linux: Fix platform device probe for DT-based PCI"
+- Remove included pachtes
+  * U_xfree86_take_second_ref_for_xcursor.patch
+  * U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
+  * U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
+  * U_Revert-linux-Make-platform-device-probe-less-fragile.patch
+  * U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
+  * U_Check-SetMap-request-length-carefully.patch
+
+-------------------------------------------------------------------
+Mon Dec  7 11:36:04 UTC 2020 - Stefan Dirsch <sndir...@suse.com>
+
+- remove unneeded python2 script 'fdi2iclass.py' from 
+  xorg-x11-server-sources subpackage (boo#1179591)
+
+-------------------------------------------------------------------

Old:
----
  U_Check-SetMap-request-length-carefully.patch
  U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
  U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
  U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
  U_Revert-linux-Make-platform-device-probe-less-fragile.patch
  U_xfree86_take_second_ref_for_xcursor.patch
  xserver-1.20.9.tar.xz

New:
----
  xserver-1.20.10.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xorg-x11-server.spec ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old  2020-12-09 22:11:43.539085549 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new  2020-12-09 22:11:43.539085549 +0100
@@ -41,7 +41,7 @@
 %endif
 
 Name:           xorg-x11-server
-Version:        1.20.9
+Version:        1.20.10
 Release:        0
 URL:            http://xorg.freedesktop.org/
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
@@ -251,15 +251,8 @@
 Patch1505:      U_xwayland-Allow-passing-a-fd.patch
 
 Patch1600:      U_glamor_egl-Reject-OpenGL-2.1-early-on.patch
-Patch1700:      U_xfree86_take_second_ref_for_xcursor.patch
 
 Patch1801:      U_Fix-segfault-on-probing-a-non-PCI-platform-device-on.patch
-Patch1802:      U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
-Patch1803:      U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
-Patch1804:      U_Revert-linux-Make-platform-device-probe-less-fragile.patch
-
-Patch1901:      U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
-Patch1902:      U_Check-SetMap-request-length-carefully.patch
 
 %description
 This package contains the X.Org Server.
@@ -410,13 +403,7 @@
 %patch1503 -p1
 %patch1505 -p1
 %patch1600 -p1
-%patch1700 -p1
 %patch1801 -p1
-%patch1802 -p1
-%patch1803 -p1
-%patch1804 -p1
-%patch1901 -p1
-%patch1902 -p1
 
 %build
 %define _lto_cflags %{nil}
@@ -549,6 +536,8 @@
 
 mkdir -p %{buildroot}/usr/src/xserver
 xargs cp --parents --target-directory=%{buildroot}/usr/src/xserver < 
source-file-list
+# unneeded python2 script; simply remove it (boo#1179591)
+rm -f %{buildroot}/usr/src/xserver/config/fdi2iclass.py
 
 %post
 %tmpfiles_create xbb.conf

++++++ _service ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old  2020-12-09 22:11:43.635085646 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new  2020-12-09 22:11:43.639085650 +0100
@@ -2,7 +2,7 @@
   <service name="tar_scm" mode="disabled">
     <param name="url">https://gitlab.freedesktop.org/xorg/xserver.git</param>
     <param name="scm">git</param>
-    <param name="revision">afb77415</param>
+    <param name="revision">bc111a2e</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">xorgserver(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old  2020-12-09 22:11:43.659085670 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new  2020-12-09 22:11:43.659085670 +0100
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.freedesktop.org/xorg/xserver.git</param>
-              <param 
name="changesrevision">afb77415e1fb862c322754230f63bb70fd596943</param></service></servicedata>
\ No newline at end of file
+              <param 
name="changesrevision">bc111a2e67e16d4e6d4f3196ab86c22c1e278c45</param></service></servicedata>
\ No newline at end of file

++++++ xserver-1.20.9.tar.xz -> xserver-1.20.10.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/Xext/Makefile.am 
new/xserver-1.20.10/Xext/Makefile.am
--- old/xserver-1.20.9/Xext/Makefile.am 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/Xext/Makefile.am        2020-12-01 17:25:37.000000000 
+0100
@@ -1,4 +1,4 @@
-noinst_LTLIBRARIES = libXext.la libXvidmode.la
+noinst_LTLIBRARIES = libXext.la libXvidmode.la libhashtable.la
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
@@ -35,7 +35,7 @@
 endif
 
 # XResource extension: lets clients get data about per-client resource usage
-RES_SRCS = hashtable.c hashtable.h xres.c
+RES_SRCS = xres.c
 if RES
 BUILTIN_SRCS  += $(RES_SRCS)
 endif
@@ -95,10 +95,16 @@
 
 libXext_la_SOURCES =           $(BUILTIN_SRCS)
 libXext_la_LIBADD =            $(BUILTIN_LIBS)
+if RES
+libXext_la_LIBADD += libhashtable.la
+endif
 
 # XVidMode extension
 libXvidmode_la_SOURCES = vidmode.c
 
+#Hashtable
+libhashtable_la_SOURCES = hashtable.c hashtable.h
+
 EXTRA_DIST = \
        $(MITSHM_SRCS) \
        $(XV_SRCS) \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/config/udev.c 
new/xserver-1.20.10/config/udev.c
--- old/xserver-1.20.9/config/udev.c    2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/config/udev.c   2020-12-01 17:25:37.000000000 +0100
@@ -56,7 +56,7 @@
 
 #ifdef CONFIG_UDEV_KMS
 static void
-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char 
*path, const char *syspath,
+config_udev_odev_setup_attribs(const char *path, const char *syspath,
                                int major, int minor,
                                config_odev_probe_proc_ptr probe_callback);
 #endif
@@ -128,7 +128,7 @@
 
         LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", path);
 
-        config_udev_odev_setup_attribs(udev_device, path, syspath, 
major(devnum),
+        config_udev_odev_setup_attribs(path, syspath, major(devnum),
                                        minor(devnum), NewGPUDeviceRequest);
         return;
     }
@@ -322,7 +322,7 @@
 
         LogMessage(X_INFO, "config/udev: removing GPU device %s %s\n",
                    syspath, path);
-        config_udev_odev_setup_attribs(device, path, syspath, major(devnum),
+        config_udev_odev_setup_attribs(path, syspath, major(devnum),
                                        minor(devnum), DeleteGPUDeviceRequest);
         /* Retry vtenter after a drm node removal */
         systemd_logind_vtenter();
@@ -464,50 +464,18 @@
 
 #ifdef CONFIG_UDEV_KMS
 
-/* Find the last occurrence of the needle in haystack */
-static char *strrstr(const char *haystack, const char *needle)
-{
-    char *prev, *last, *tmp;
-
-    prev = strstr(haystack, needle);
-    if (!prev)
-        return NULL;
-
-    last = prev;
-    tmp = prev + 1;
-
-    while (tmp) {
-        last = strstr(tmp, needle);
-        if (!last)
-            return prev;
-        else {
-            prev = last;
-            tmp = prev + 1;
-        }
-    }
-
-    return last;
-}
-
 static void
-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char 
*path, const char *syspath,
+config_udev_odev_setup_attribs(const char *path, const char *syspath,
                                int major, int minor,
                                config_odev_probe_proc_ptr probe_callback)
 {
     struct OdevAttributes *attribs = config_odev_allocate_attributes();
-    const char *value, *str;
 
     attribs->path = XNFstrdup(path);
     attribs->syspath = XNFstrdup(syspath);
     attribs->major = major;
     attribs->minor = minor;
 
-    value = udev_device_get_property_value(udev_device, "ID_PATH");
-    if (value && (str = strrstr(value, "pci-"))) {
-        attribs->busid = XNFstrdup(str);
-        attribs->busid[3] = ':';
-    }
-
     /* ownership of attribs is passed to probe layer */
     probe_callback(attribs);
 }
@@ -548,7 +516,7 @@
         else if (!check_seat(udev_device))
             goto no_probe;
 
-        config_udev_odev_setup_attribs(udev_device, path, syspath, 
major(devnum),
+        config_udev_odev_setup_attribs(path, syspath, major(devnum),
                                        minor(devnum), probe_callback);
     no_probe:
         udev_device_unref(udev_device);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/configure.ac 
new/xserver-1.20.10/configure.ac
--- old/xserver-1.20.9/configure.ac     2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/configure.ac    2020-12-01 17:25:37.000000000 +0100
@@ -26,9 +26,9 @@
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.60)
-AC_INIT([xorg-server], 1.20.9, 
[https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
-RELEASE_DATE="2020-08-25"
-RELEASE_NAME="Chicken Parmigiana"
+AC_INIT([xorg-server], 1.20.10, 
[https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
+RELEASE_DATE="2020-12-01"
+RELEASE_NAME="Chicken Pot Pie"
 AC_CONFIG_SRCDIR([Makefile.am])
 AC_CONFIG_MACRO_DIR([m4])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
@@ -1064,9 +1064,11 @@
        SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $SCRNSAVERPROTO"
 fi
 
+HASHTABLE=no
 AM_CONDITIONAL(RES, [test "x$RES" = xyes])
 if test "x$RES" = xyes; then
        AC_DEFINE(RES, 1, [Support X resource extension])
+       HASHTABLE=yes
        REQUIRED_MODULES="$REQUIRED_MODULES $RESOURCEPROTO"
        SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $RESOURCEPROTO"
 fi
@@ -1250,6 +1252,7 @@
        PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
        AC_SUBST(XLIB_CFLAGS)
        AC_DEFINE(GLXEXT, 1, [Build GLX extension])
+       HASHTABLE=yes
        GLX_LIBS='$(top_builddir)/glx/libglx.la 
$(top_builddir)/glx/libglxvnd.la'
        GLX_SYS_LIBS="$GLX_SYS_LIBS $GL_LIBS"
 else
@@ -1257,6 +1260,8 @@
 fi
 AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
 
+AM_CONDITIONAL(HASHTABLE, test "x$HASHTABLE" = xyes)
+
 AC_SUBST([GLX_DEFINES])
 AC_SUBST([GLX_SYS_LIBS])
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/glamor/glamor_egl.c 
new/xserver-1.20.10/glamor/glamor_egl.c
--- old/xserver-1.20.9/glamor/glamor_egl.c      2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/glamor/glamor_egl.c     2020-12-01 17:25:37.000000000 
+0100
@@ -350,6 +350,9 @@
      */
     glamor_egl_exchange_buffers(pixmap, exported);
 
+    /* Swap the devKind into the original pixmap, reflecting the bo's stride */
+    screen->ModifyPixmapHeader(pixmap, 0, 0, 0, 0, exported->devKind, NULL);
+
     screen->DestroyPixmap(exported);
 
     return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/glamor/glamor_rects.c 
new/xserver-1.20.10/glamor/glamor_rects.c
--- old/xserver-1.20.9/glamor/glamor_rects.c    2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/glamor/glamor_rects.c   2020-12-01 17:25:37.000000000 
+0100
@@ -27,8 +27,10 @@
 static const glamor_facet glamor_facet_polyfillrect_130 = {
     .name = "poly_fill_rect",
     .version = 130,
-    .vs_vars = "attribute vec4 primitive;\n",
-    .vs_exec = ("       vec2 pos = primitive.zw * vec2(gl_VertexID&1, 
(gl_VertexID&2)>>1);\n"
+    .source_name = "size",
+    .vs_vars = "attribute vec2 primitive;\n"
+               "attribute vec2 size;\n",
+    .vs_exec = ("       vec2 pos = size * vec2(gl_VertexID&1, 
(gl_VertexID&2)>>1);\n"
                 GLAMOR_POS(gl_Position, (primitive.xy + pos))),
 };
 
@@ -81,9 +83,14 @@
 
         glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
         glVertexAttribDivisor(GLAMOR_VERTEX_POS, 1);
-        glVertexAttribPointer(GLAMOR_VERTEX_POS, 4, GL_SHORT, GL_FALSE,
+        glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_SHORT, GL_FALSE,
                               4 * sizeof (short), vbo_offset);
 
+        glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+        glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 1);
+        glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_UNSIGNED_SHORT, 
GL_FALSE,
+                              4 * sizeof (short), vbo_offset + 2 * sizeof 
(short));
+
         memcpy(v, prect, nrect * sizeof (xRectangle));
 
         glamor_put_vbo_space(screen);
@@ -156,8 +163,11 @@
 
 bail:
     glDisable(GL_SCISSOR_TEST);
-    if (glamor_priv->glsl_version >= 130)
+    if (glamor_priv->glsl_version >= 130) {
+        glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0);
+        glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
         glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
+    }
     glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 
     return ret;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/glx/Makefile.am 
new/xserver-1.20.10/glx/Makefile.am
--- old/xserver-1.20.9/glx/Makefile.am  2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/glx/Makefile.am 2020-12-01 17:25:37.000000000 +0100
@@ -81,7 +81,7 @@
         unpack.h \
         xfont.c
 
-libglx_la_LIBADD = $(DLOPEN_LIBS)
+libglx_la_LIBADD = $(DLOPEN_LIBS) $(top_builddir)/Xext/libhashtable.la
 
 libglxvnd_la_SOURCES = \
        vndcmds.c \
@@ -90,4 +90,6 @@
        vndservervendor.h \
        vndservervendor.c
 
+libglxvnd_la_LIBADD = $(top_builddir)/Xext/libhashtable.la
+
 EXTRA_DIST = vnd_dispatch_stubs.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/driver.c 
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/driver.c
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/driver.c  2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/driver.c 2020-12-01 
17:25:37.000000000 +0100
@@ -705,7 +705,7 @@
 
     msBlockHandler(pScreen, pTimeout);
 
-    drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE);
+    drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE, FALSE);
 }
 
 static void
@@ -1348,7 +1348,7 @@
     ret = pScreen->CreateScreenResources(pScreen);
     pScreen->CreateScreenResources = CreateScreenResources;
 
-    if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, pScrn->is_gpu))
+    if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, pScrn->is_gpu, FALSE))
         return FALSE;
 
     if (!drmmode_glamor_handle_new_screen_pixmap(&ms->drmmode))
@@ -1820,8 +1820,25 @@
 
     SetMaster(pScrn);
 
-    if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE))
-        return FALSE;
+    drmmode_update_kms_state(&ms->drmmode);
+
+    /* allow not all modes to be set successfully since some events might have
+     * happened while not being master that could prevent the previous
+     * configuration from being re-applied.
+     */
+    if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE, TRUE)) {
+        xf86DisableUnusedFunctions(pScrn);
+
+        /* TODO: check that at least one screen is on, to allow the user to fix
+         * their setup if all modeset failed...
+         */
+
+        /* Tell the desktop environment that something changed, so that they
+         * can hopefully correct the situation
+         */
+        RRSetChanged(xf86ScrnToScreen(pScrn));
+        RRTellChanged(xf86ScrnToScreen(pScrn));
+    }
 
     return TRUE;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.c 
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.c
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.c 
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.c        
2020-12-01 17:25:37.000000000 +0100
@@ -3457,9 +3457,11 @@
 }
 
 Bool
-drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw)
+drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw,
+                          Bool ign_err)
 {
     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+    Bool success = TRUE;
     int c;
 
     for (c = 0; c < config->num_crtc; c++) {
@@ -3507,8 +3509,17 @@
         if (set_hw) {
             if (!crtc->funcs->
                 set_mode_major(crtc, &crtc->desiredMode, crtc->desiredRotation,
-                               crtc->desiredX, crtc->desiredY))
-                return FALSE;
+                               crtc->desiredX, crtc->desiredY)) {
+                if (!ign_err)
+                    return FALSE;
+                else {
+                    success = FALSE;
+                    crtc->enabled = FALSE;
+                    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                               "Failed to set the desired mode on connector 
%s\n",
+                               output->name);
+                }
+            }
         } else {
             crtc->mode = crtc->desiredMode;
             crtc->rotation = crtc->desiredRotation;
@@ -3522,7 +3533,7 @@
     /* Validate leases on VT re-entry */
     drmmode_validate_leases(pScrn);
 
-    return TRUE;
+    return success;
 }
 
 static void
@@ -3607,30 +3618,19 @@
     return TRUE;
 }
 
-#ifdef CONFIG_UDEV_KMS
-
 #define DRM_MODE_LINK_STATUS_GOOD       0
 #define DRM_MODE_LINK_STATUS_BAD        1
 
-static void
-drmmode_handle_uevents(int fd, void *closure)
+void
+drmmode_update_kms_state(drmmode_ptr drmmode)
 {
-    drmmode_ptr drmmode = closure;
     ScrnInfoPtr scrn = drmmode->scrn;
-    struct udev_device *dev;
     drmModeResPtr mode_res;
     xf86CrtcConfigPtr  config = XF86_CRTC_CONFIG_PTR(scrn);
     int i, j;
     Bool found = FALSE;
     Bool changed = FALSE;
 
-    while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
-        udev_device_unref(dev);
-        found = TRUE;
-    }
-    if (!found)
-        return;
-
     /* Try to re-set the mode on all the connectors with a BAD link-state:
      * This may happen if a link degrades and a new modeset is necessary, using
      * different link-training parameters. If the kernel found that the current
@@ -3745,6 +3745,25 @@
 #undef DRM_MODE_LINK_STATUS_BAD
 #undef DRM_MODE_LINK_STATUS_GOOD
 
+#ifdef CONFIG_UDEV_KMS
+
+static void
+drmmode_handle_uevents(int fd, void *closure)
+{
+    drmmode_ptr drmmode = closure;
+    struct udev_device *dev;
+    Bool found = FALSE;
+
+    while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
+        udev_device_unref(dev);
+        found = TRUE;
+    }
+    if (!found)
+        return;
+
+    drmmode_update_kms_state(drmmode);
+}
+
 #endif
 
 void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.h 
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.h
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.h 
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.h        
2020-12-01 17:25:37.000000000 +0100
@@ -278,9 +278,11 @@
 extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
 extern Bool drmmode_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
 void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int 
y);
-extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, 
Bool set_hw);
+extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
+                                      Bool set_hw, Bool ign_err);
 extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
 
+extern void drmmode_update_kms_state(drmmode_ptr drmmode);
 extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
 extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xserver-1.20.9/hw/xfree86/os-support/linux/lnx_platform.c 
new/xserver-1.20.10/hw/xfree86/os-support/linux/lnx_platform.c
--- old/xserver-1.20.9/hw/xfree86/os-support/linux/lnx_platform.c       
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/os-support/linux/lnx_platform.c      
2020-12-01 17:25:37.000000000 +0100
@@ -23,13 +23,13 @@
 static Bool
 get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
 {
+    drmSetVersion sv;
     drmVersionPtr v;
+    char *buf;
     int fd;
     int err = 0;
     Bool paused, server_fd = FALSE;
 
-    LogMessage(X_INFO, "Platform probe for %s\n", attribs->syspath);
-
     fd = systemd_logind_take_fd(attribs->major, attribs->minor, path, &paused);
     if (fd != -1) {
         if (paused) {
@@ -48,6 +48,18 @@
     if (fd == -1)
         return FALSE;
 
+    sv.drm_di_major = 1;
+    sv.drm_di_minor = 4;
+    sv.drm_dd_major = -1;       /* Don't care */
+    sv.drm_dd_minor = -1;       /* Don't care */
+
+    err = drmSetInterfaceVersion(fd, &sv);
+    if (err) {
+        xf86Msg(X_ERROR, "%s: failed to set DRM interface version 1.4: %s\n",
+                path, strerror(-err));
+        goto out;
+    }
+
     /* for a delayed probe we've already added the device */
     if (delayed_index == -1) {
             xf86_add_platform_device(attribs, FALSE);
@@ -57,6 +69,10 @@
     if (server_fd)
         xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD;
 
+    buf = drmGetBusid(fd);
+    xf86_platform_odev_attributes(delayed_index)->busid = XNFstrdup(buf);
+    drmFreeBusid(buf);
+
     v = drmGetVersion(fd);
     if (!v) {
         xf86Msg(X_ERROR, "%s: failed to query DRM version\n", path);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/hw/xfree86/ramdac/xf86CursorRD.c 
new/xserver-1.20.10/hw/xfree86/ramdac/xf86CursorRD.c
--- old/xserver-1.20.9/hw/xfree86/ramdac/xf86CursorRD.c 2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/ramdac/xf86CursorRD.c        2020-12-01 
17:25:37.000000000 +0100
@@ -334,6 +334,9 @@
         ScreenPriv->HotY = cursor->bits->yhot;
 
         if (!infoPtr->pScrn->vtSema) {
+            cursor = RefCursor(cursor);
+            if (ScreenPriv->SavedCursor)
+                FreeCursor(ScreenPriv->SavedCursor, None);
             ScreenPriv->SavedCursor = cursor;
             return;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xserver-1.20.9/hw/xwayland/xwayland-glamor-eglstream.c 
new/xserver-1.20.10/hw/xwayland/xwayland-glamor-eglstream.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-glamor-eglstream.c  2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-glamor-eglstream.c 2020-12-01 
17:25:37.000000000 +0100
@@ -431,8 +431,8 @@
     DebugF("eglstream: win %d completes eglstream for pixmap %p, congrats!\n",
            pending->window->drawable.id, pending->pixmap);
 
-    xwl_eglstream_window_set_pending(pending->window, NULL);
 out:
+    xwl_eglstream_window_set_pending(pending->window, NULL);
     xorg_list_del(&pending->link);
     free(pending);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland-glamor-gbm.c 
new/xserver-1.20.10/hw/xwayland/xwayland-glamor-gbm.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-glamor-gbm.c        2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-glamor-gbm.c       2020-12-01 
17:25:37.000000000 +0100
@@ -111,21 +111,6 @@
 }
 
 static char
-is_fd_render_node(int fd)
-{
-    struct stat render;
-
-    if (fstat(fd, &render))
-        return 0;
-    if (!S_ISCHR(render.st_mode))
-        return 0;
-    if (render.st_rdev & 0x80)
-        return 1;
-
-    return 0;
-}
-
-static char
 is_device_path_render_node (const char *device_path)
 {
     char is_render_node;
@@ -135,7 +120,7 @@
     if (fd < 0)
         return 0;
 
-    is_render_node = is_fd_render_node(fd);
+    is_render_node = (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER);
     close(fd);
 
     return is_render_node;
@@ -767,7 +752,7 @@
        return;
    }
 
-   if (is_fd_render_node(xwl_gbm->drm_fd)) {
+   if (drmGetNodeTypeFromFd(xwl_gbm->drm_fd) == DRM_NODE_RENDER) {
        xwl_gbm->fd_render_node = 1;
        xwl_screen->expecting_event--;
    } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland-present.c 
new/xserver-1.20.10/hw/xwayland/xwayland-present.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-present.c   2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-present.c  2020-12-01 
17:25:37.000000000 +0100
@@ -421,10 +421,18 @@
                         PresentFlipReason *reason)
 {
     struct xwl_window *xwl_window = xwl_window_from_window(present_window);
+    ScreenPtr screen = pixmap->drawable.pScreen;
 
     if (!xwl_window)
         return FALSE;
 
+    /* Can't flip if the window pixmap doesn't match the xwl_window parent
+     * window's, e.g. because a client redirected this window or one of its
+     * parents.
+     */
+    if (screen->GetWindowPixmap(xwl_window->window) != 
screen->GetWindowPixmap(present_window))
+        return FALSE;
+
     /*
      * We currently only allow flips of windows, that have the same
      * dimensions as their xwl_window parent window. For the case of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland.c 
new/xserver-1.20.10/hw/xwayland/xwayland.c
--- old/xserver-1.20.9/hw/xwayland/xwayland.c   2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland.c  2020-12-01 17:25:37.000000000 
+0100
@@ -193,8 +193,6 @@
 xwl_window_property_allow_commits(struct xwl_window *xwl_window,
                                   PropertyStateRec *propstate)
 {
-    Bool old_allow_commits = xwl_window->allow_commits;
-
     switch (propstate->state) {
     case PropertyNewValue:
         xwl_window_set_allow_commits_from_property(xwl_window, 
propstate->prop);
@@ -207,17 +205,6 @@
     default:
         break;
     }
-
-    /* If allow_commits turned from off to on, discard any frame
-     * callback we might be waiting for so that a new buffer is posted
-     * immediately through block_handler() if there is damage to post.
-     */
-    if (!old_allow_commits && xwl_window->allow_commits) {
-        if (xwl_window->frame_callback) {
-            wl_callback_destroy(xwl_window->frame_callback);
-            xwl_window->frame_callback = NULL;
-        }
-    }
 }
 
 static void
@@ -540,7 +527,7 @@
     struct xwl_window *xwl_window;
     struct wl_region *region;
 
-    if (xwl_window_get(window))
+    if (xwl_window_from_window(window))
         return TRUE;
 
     xwl_screen = xwl_screen_get(screen);
@@ -1215,6 +1202,11 @@
                              &registry_listener, xwl_screen);
     xwl_screen_roundtrip(xwl_screen);
 
+    if (!xwl_screen->rootless && !xwl_screen->shell) {
+        ErrorF("missing wl_shell protocol\n");
+        return FALSE;
+    }
+
     bpc = xwl_screen->depth / 3;
     green_bpc = xwl_screen->depth - 2 * bpc;
     blue_mask = (1 << bpc) - 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/include/misc.h 
new/xserver-1.20.10/include/misc.h
--- old/xserver-1.20.9/include/misc.h   2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/include/misc.h  2020-12-01 17:25:37.000000000 +0100
@@ -91,7 +91,7 @@
 #define LIMITCLIENTS   256     /* Must be a power of 2 and <= MAXCLIENTS */
 #define MAXEXTENSIONS   128
 #define MAXFORMATS     8
-#define MAXDEVICES     40      /* input devices */
+#define MAXDEVICES     256      /* input devices */
 #define GPU_SCREEN_OFFSET 256
 
 /* 128 event opcodes for core + extension events, excluding GE */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/meson.build 
new/xserver-1.20.10/meson.build
--- old/xserver-1.20.9/meson.build      2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/meson.build     2020-12-01 17:25:37.000000000 +0100
@@ -3,7 +3,7 @@
             'buildtype=debugoptimized',
             'c_std=gnu99',
         ],
-        version: '1.20.9',
+        version: '1.20.10',
         meson_version: '>= 0.42.0',
 )
 add_project_arguments('-DHAVE_DIX_CONFIG_H', language: 'c')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/os/backtrace.c 
new/xserver-1.20.10/os/backtrace.c
--- old/xserver-1.20.9/os/backtrace.c   2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/os/backtrace.c  2020-12-01 17:25:37.000000000 +0100
@@ -45,6 +45,7 @@
 {
     unw_cursor_t cursor;
     unw_context_t context;
+    unw_word_t ip;
     unw_word_t off;
     unw_proc_info_t pip;
     int ret, i = 0;
@@ -88,7 +89,9 @@
             procname[1] = 0;
         }
 
-        if (dladdr((void *)(uintptr_t)(pip.start_ip + off), &dlinfo) && 
dlinfo.dli_fname &&
+        if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0)
+          ip = pip.start_ip + off;
+        if (dladdr((void *)(uintptr_t)(ip), &dlinfo) && dlinfo.dli_fname &&
                 *dlinfo.dli_fname)
             filename = dlinfo.dli_fname;
         else
@@ -96,7 +99,7 @@
 
         ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname,
             ret == -UNW_ENOMEM ? "..." : "", (int)off,
-            (void *)(uintptr_t)(pip.start_ip + off));
+            (void *)(uintptr_t)(ip));
 
         ret = unw_step(&cursor);
         if (ret < 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/present/present_execute.c 
new/xserver-1.20.10/present/present_execute.c
--- old/xserver-1.20.9/present/present_execute.c        2020-08-25 
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/present/present_execute.c       2020-12-01 
17:25:37.000000000 +0100
@@ -48,16 +48,13 @@
     ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
 
-    if (vblank->requeue) {
-        vblank->requeue = FALSE;
-        if (msc_is_after(vblank->target_msc, crtc_msc) &&
-            Success == screen_priv->queue_vblank(screen,
-                                                 window,
-                                                 vblank->crtc,
-                                                 vblank->event_id,
-                                                 vblank->target_msc))
-            return TRUE;
-    }
+    /* We may have to requeue for the next MSC if check_flip_window prevented
+     * using a flip.
+     */
+    if (vblank->exec_msc == crtc_msc + 1 &&
+        screen_priv->queue_vblank(screen, window, vblank->crtc, 
vblank->event_id,
+                                  vblank->exec_msc) == Success)
+        return TRUE;
 
     if (vblank->wait_fence) {
         if (!present_fence_check_triggered(vblank->wait_fence)) {
@@ -75,13 +72,13 @@
     ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
 
-    /* If present_flip failed, we may have to requeue for the target MSC */
-    if (vblank->target_msc == crtc_msc + 1 &&
+    /* If present_flip failed, we may have to requeue for the next MSC */
+    if (vblank->exec_msc == crtc_msc + 1 &&
         Success == screen_priv->queue_vblank(screen,
                                              window,
                                              vblank->crtc,
                                              vblank->event_id,
-                                             vblank->target_msc)) {
+                                             vblank->exec_msc)) {
         vblank->queued = TRUE;
         return;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/present/present_priv.h 
new/xserver-1.20.10/present/present_priv.h
--- old/xserver-1.20.9/present/present_priv.h   2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/present/present_priv.h  2020-12-01 17:25:37.000000000 
+0100
@@ -70,14 +70,14 @@
     int16_t             y_off;
     CARD16              kind;
     uint64_t            event_id;
-    uint64_t            target_msc;
+    uint64_t            target_msc;     /* target MSC when present should 
complete */
+    uint64_t            exec_msc;       /* MSC at which present can be 
executed */
     uint64_t            msc_offset;
     present_fence_ptr   idle_fence;
     present_fence_ptr   wait_fence;
     present_notify_ptr  notifies;
     int                 num_notifies;
     Bool                queued;         /* on present_exec_queue */
-    Bool                requeue;        /* on queue, but target_msc has 
changed */
     Bool                flip;           /* planning on using flip */
     Bool                flip_ready;     /* wants to flip, but waiting for 
previous flip or unflip */
     Bool                flip_idler;     /* driver explicitly permitted idling 
*/
@@ -469,7 +469,7 @@
                       const uint32_t *capabilities,
                       present_notify_ptr notifies,
                       int num_notifies,
-                      uint64_t *target_msc,
+                      uint64_t target_msc,
                       uint64_t crtc_msc);
 
 void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/present/present_scmd.c 
new/xserver-1.20.10/present/present_scmd.c
--- old/xserver-1.20.9/present/present_scmd.c   2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/present/present_scmd.c  2020-12-01 17:25:37.000000000 
+0100
@@ -361,8 +361,8 @@
     ScreenPtr                   screen = vblank->screen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 
-    DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" 
PRIx32 "\n",
-                  vblank->event_id, vblank, vblank->target_msc,
+    DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " 
-> %08" PRIx32 "\n",
+                  vblank->event_id, vblank, vblank->exec_msc, 
vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
                   vblank->window ? vblank->window->drawable.id : 0));
 
@@ -482,7 +482,7 @@
             vblank->flip = FALSE;
             vblank->reason = reason;
             if (vblank->sync_flip)
-                vblank->requeue = TRUE;
+                vblank->exec_msc = vblank->target_msc;
         }
     }
 }
@@ -608,6 +608,7 @@
               */
             screen_priv->flip_pending = NULL;
             vblank->flip = FALSE;
+            vblank->exec_msc = vblank->target_msc;
         }
         DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
                       vblank, crtc_msc, vblank->pixmap->drawable.id, 
vblank->window->drawable.id));
@@ -745,16 +746,19 @@
                                    screen_priv->info ? 
&screen_priv->info->capabilities : NULL,
                                    notifies,
                                    num_notifies,
-                                   &target_msc,
+                                   target_msc,
                                    crtc_msc);
 
     if (!vblank)
         return BadAlloc;
 
+    if (vblank->flip && vblank->sync_flip)
+        vblank->exec_msc--;
+
     xorg_list_append(&vblank->event_queue, &present_exec_queue);
     vblank->queued = TRUE;
-    if (msc_is_after(target_msc, crtc_msc)) {
-        ret = present_queue_vblank(screen, window, target_crtc, 
vblank->event_id, target_msc);
+    if (msc_is_after(vblank->exec_msc, crtc_msc)) {
+        ret = present_queue_vblank(screen, window, target_crtc, 
vblank->event_id, vblank->exec_msc);
         if (ret == Success)
             return Success;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/present/present_vblank.c 
new/xserver-1.20.10/present/present_vblank.c
--- old/xserver-1.20.9/present/present_vblank.c 2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/present/present_vblank.c        2020-12-01 
17:25:37.000000000 +0100
@@ -57,7 +57,7 @@
                       const uint32_t *capabilities,
                       present_notify_ptr notifies,
                       int num_notifies,
-                      uint64_t *target_msc,
+                      uint64_t target_msc,
                       uint64_t crtc_msc)
 {
     ScreenPtr                   screen = window->drawable.pScreen;
@@ -100,7 +100,8 @@
 
     vblank->x_off = x_off;
     vblank->y_off = y_off;
-    vblank->target_msc = *target_msc;
+    vblank->target_msc = target_msc;
+    vblank->exec_msc = target_msc;
     vblank->crtc = target_crtc;
     vblank->msc_offset = window_priv->msc_offset;
     vblank->notifies = notifies;
@@ -111,12 +112,11 @@
     if (pixmap != NULL &&
         !(options & PresentOptionCopy) &&
         capabilities) {
-        if (msc_is_after(*target_msc, crtc_msc) &&
+        if (msc_is_after(target_msc, crtc_msc) &&
             screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid, 
x_off, y_off, &reason))
         {
             vblank->flip = TRUE;
             vblank->sync_flip = TRUE;
-            *target_msc = *target_msc - 1;
         } else if ((*capabilities & PresentCapabilityAsync) &&
             screen_priv->check_flip (target_crtc, window, pixmap, FALSE, 
valid, x_off, y_off, &reason))
         {
@@ -139,7 +139,7 @@
 
     if (pixmap)
         DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" 
PRIx32 " (crtc %p) flip %d vsync %d serial %d\n",
-                      vblank->event_id, vblank, *target_msc,
+                      vblank->event_id, vblank, target_msc,
                       vblank->pixmap->drawable.id, vblank->window->drawable.id,
                       target_crtc, vblank->flip, vblank->sync_flip, 
vblank->serial));
     return vblank;
@@ -153,8 +153,8 @@
 void
 present_vblank_scrap(present_vblank_ptr vblank)
 {
-    DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" 
PRIx32 " (crtc %p)\n",
-                  vblank->event_id, vblank, vblank->target_msc,
+    DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " 
-> %08" PRIx32 " (crtc %p)\n",
+                  vblank->event_id, vblank, vblank->exec_msc, 
vblank->target_msc,
                   vblank->pixmap->drawable.id, vblank->window->drawable.id,
                   vblank->crtc));
 
@@ -175,8 +175,8 @@
     /* Also make sure vblank is removed from event queue (wnmd) */
     xorg_list_del(&vblank->event_queue);
 
-    DebugPresent(("\td %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" 
PRIx32 "\n",
-                  vblank->event_id, vblank, vblank->target_msc,
+    DebugPresent(("\td %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " 
-> %08" PRIx32 "\n",
+                  vblank->event_id, vblank, vblank->exec_msc, 
vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
                   vblank->window ? vblank->window->drawable.id : 0));
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/present/present_wnmd.c 
new/xserver-1.20.10/present/present_wnmd.c
--- old/xserver-1.20.9/present/present_wnmd.c   2020-08-25 17:23:42.000000000 
+0200
+++ new/xserver-1.20.10/present/present_wnmd.c  2020-12-01 17:25:37.000000000 
+0100
@@ -42,6 +42,17 @@
 static void
 present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t 
crtc_msc);
 
+static int
+present_wnmd_queue_vblank(ScreenPtr screen,
+                          WindowPtr window,
+                          RRCrtcPtr crtc,
+                          uint64_t event_id,
+                          uint64_t msc)
+{
+    present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+    return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, 
msc);
+}
+
 static void
 present_wnmd_create_event_id(present_window_priv_ptr window_priv, 
present_vblank_ptr vblank)
 {
@@ -111,7 +122,8 @@
     present_vblank_ptr              vblank, tmp;
 
     xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->idle_queue, 
event_queue) {
-        present_wnmd_free_idle_vblank(vblank);
+        if (vblank->flip)
+            present_wnmd_free_idle_vblank(vblank);
     }
 
     if (window_priv->flip_active) {
@@ -168,8 +180,8 @@
     WindowPtr                   window = vblank->window;
     present_window_priv_ptr     window_priv = present_window_priv(window);
 
-    DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" 
PRIx32 "\n",
-                  vblank->event_id, vblank, vblank->target_msc,
+    DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " 
-> %08" PRIx32 "\n",
+                  vblank->event_id, vblank, vblank->exec_msc, 
vblank->target_msc,
                   vblank->pixmap ? vblank->pixmap->drawable.id : 0,
                   vblank->window ? vblank->window->drawable.id : 0));
 
@@ -234,7 +246,12 @@
 
     xorg_list_for_each_entry(vblank, &window_priv->idle_queue, event_queue) {
         if (vblank->event_id == event_id) {
-            present_wnmd_free_idle_vblank(vblank);
+            if (vblank->flip)
+                present_wnmd_free_idle_vblank(vblank);
+            else
+                /* Copies which were executed but need their completion event 
sent */
+                present_execute_post(vblank, ust, msc);
+
             return;
         }
     }
@@ -270,10 +287,6 @@
     if (!screen_priv->wnmd_info->flip)
         return FALSE;
 
-    /* Can't flip redirected child windows */
-    if (screen->GetWindowPixmap(window) != 
screen->GetWindowPixmap(toplvl_window))
-        return FALSE;
-
     /* Source pixmap must align with window exactly */
     if (x_off || y_off)
         return FALSE;
@@ -291,6 +304,10 @@
     if ( !RegionEqual(&window->winSize, &toplvl_window->winSize) )
         return FALSE;
 
+    /* Can't flip if window clipped by children */
+    if (!RegionEqual(&window->clipList, &window->winSize))
+        return FALSE;
+
     /* Ask the driver for permission */
     if (screen_priv->wnmd_info->check_flip2) {
         if (!(*screen_priv->wnmd_info->check_flip2) (crtc, window, pixmap, 
sync_flip, reason)) {
@@ -342,8 +359,6 @@
                                          vblank->sync_flip, vblank->valid, 0, 
0, &reason)) {
             vblank->flip = FALSE;
             vblank->reason = reason;
-            if (vblank->sync_flip)
-                vblank->requeue = TRUE;
         }
     }
 }
@@ -443,6 +458,7 @@
     vblank->queued = FALSE;
 
     if (vblank->pixmap && vblank->window) {
+        ScreenPtr screen = window->drawable.pScreen;
 
         if (vblank->flip) {
             RegionPtr damage;
@@ -457,10 +473,13 @@
 
             /* Set update region as damaged */
             if (vblank->update) {
-                damage = vblank->update;
+                damage = RegionDuplicate(vblank->update);
+                /* Translate update region to screen space */
+                assert(vblank->x_off == 0 && vblank->y_off == 0);
+                RegionTranslate(damage, window->drawable.x, 
window->drawable.y);
                 RegionIntersect(damage, damage, &window->clipList);
             } else
-                damage = &window->clipList;
+                damage = RegionDuplicate(&window->clipList);
 
             /* Try to flip - the vblank is now pending
              */
@@ -468,7 +487,6 @@
             // ask the driver
             if (present_wnmd_flip(vblank->window, vblank->crtc, 
vblank->event_id,
                                      vblank->target_msc, vblank->pixmap, 
vblank->sync_flip, damage)) {
-                ScreenPtr screen = window->drawable.pScreen;
                 WindowPtr toplvl_window = 
present_wnmd_toplvl_pixmap_window(vblank->window);
                 PixmapPtr old_pixmap = screen->GetWindowPixmap(window);
 
@@ -483,6 +501,7 @@
 
                 /* Report damage */
                 DamageDamageRegion(&vblank->window->drawable, damage);
+                RegionDestroy(damage);
                 return;
             }
 
@@ -498,9 +517,12 @@
         present_wnmd_cancel_flip(window);
 
         present_execute_copy(vblank, crtc_msc);
+        assert(!vblank->queued);
 
-        if (vblank->queued) {
-            xorg_list_add(&vblank->event_queue, &window_priv->exec_queue);
+        if (present_wnmd_queue_vblank(screen, window, vblank->crtc,
+                                      vblank->event_id, crtc_msc + 1)
+            == Success) {
+            xorg_list_add(&vblank->event_queue, &window_priv->idle_queue);
             xorg_list_append(&vblank->window_list, &window_priv->vblank);
 
             return;
@@ -510,17 +532,6 @@
     present_execute_post(vblank, ust, crtc_msc);
 }
 
-static int
-present_wnmd_queue_vblank(ScreenPtr screen,
-                             WindowPtr window,
-                             RRCrtcPtr crtc,
-                             uint64_t event_id,
-                             uint64_t msc)
-{
-    present_screen_priv_ptr screen_priv = present_screen_priv(screen);
-    return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, 
msc);
-}
-
 static uint64_t
 present_wnmd_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t 
window_msc, uint64_t new_msc)
 {
@@ -626,15 +637,20 @@
                                    &screen_priv->wnmd_info->capabilities,
                                    notifies,
                                    num_notifies,
-                                   &target_msc,
+                                   target_msc,
                                    crtc_msc);
     if (!vblank)
         return BadAlloc;
 
+    /* WNMD presentations always complete (at least) one frame after they
+     * are executed
+     */
+    vblank->exec_msc = vblank->target_msc - 1;
+
     xorg_list_append(&vblank->event_queue, &window_priv->exec_queue);
     vblank->queued = TRUE;
-    if (crtc_msc < target_msc) {
-        if (present_wnmd_queue_vblank(screen, window, target_crtc, 
vblank->event_id, target_msc) == Success) {
+    if (crtc_msc < vblank->exec_msc) {
+        if (present_wnmd_queue_vblank(screen, window, target_crtc, 
vblank->event_id, vblank->exec_msc) == Success) {
             return Success;
         }
         DebugPresent(("present_queue_vblank failed\n"));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xserver-1.20.9/xkb/xkb.c 
new/xserver-1.20.10/xkb/xkb.c
--- old/xserver-1.20.9/xkb/xkb.c        2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/xkb/xkb.c       2020-12-01 17:25:37.000000000 +0100
@@ -2382,6 +2382,93 @@
     return (char *) wire;
 }
 
+#define _add_check_len(new) \
+    if (len > UINT32_MAX - (new) || len > req_len - (new)) goto bad; \
+    else len += new
+
+/**
+ * Check the length of the SetMap request
+ */
+static int
+_XkbSetMapCheckLength(xkbSetMapReq *req)
+{
+    size_t len = sz_xkbSetMapReq, req_len = req->length << 2;
+    xkbKeyTypeWireDesc *keytype;
+    xkbSymMapWireDesc *symmap;
+    BOOL preserve;
+    int i, map_count, nSyms;
+
+    if (req_len < len)
+        goto bad;
+    /* types */
+    if (req->present & XkbKeyTypesMask) {
+        keytype = (xkbKeyTypeWireDesc *)(req + 1);
+        for (i = 0; i < req->nTypes; i++) {
+            _add_check_len(XkbPaddedSize(sz_xkbKeyTypeWireDesc));
+            if (req->flags & XkbSetMapResizeTypes) {
+                _add_check_len(keytype->nMapEntries
+                               * sz_xkbKTSetMapEntryWireDesc);
+                preserve = keytype->preserve;
+                map_count = keytype->nMapEntries;
+                if (preserve) {
+                    _add_check_len(map_count * sz_xkbModsWireDesc);
+                }
+                keytype += 1;
+                keytype = (xkbKeyTypeWireDesc *)
+                          ((xkbKTSetMapEntryWireDesc *)keytype + map_count);
+                if (preserve)
+                    keytype = (xkbKeyTypeWireDesc *)
+                              ((xkbModsWireDesc *)keytype + map_count);
+            }
+        }
+    }
+    /* syms */
+    if (req->present & XkbKeySymsMask) {
+        symmap = (xkbSymMapWireDesc *)((char *)req + len);
+        for (i = 0; i < req->nKeySyms; i++) {
+            _add_check_len(sz_xkbSymMapWireDesc);
+            nSyms = symmap->nSyms;
+            _add_check_len(nSyms*sizeof(CARD32));
+            symmap += 1;
+            symmap = (xkbSymMapWireDesc *)((CARD32 *)symmap + nSyms);
+        }
+    }
+    /* actions */
+    if (req->present & XkbKeyActionsMask) {
+        _add_check_len(req->totalActs * sz_xkbActionWireDesc 
+                       + XkbPaddedSize(req->nKeyActs));
+    }
+    /* behaviours */
+    if (req->present & XkbKeyBehaviorsMask) {
+        _add_check_len(req->totalKeyBehaviors * sz_xkbBehaviorWireDesc);
+    }
+    /* vmods */
+    if (req->present & XkbVirtualModsMask) {
+        _add_check_len(XkbPaddedSize(Ones(req->virtualMods)));
+    }
+    /* explicit */
+    if (req->present & XkbExplicitComponentsMask) {
+        /* two bytes per non-zero explicit componen */
+        _add_check_len(XkbPaddedSize(req->totalKeyExplicit * sizeof(CARD16)));
+    }
+    /* modmap */
+    if (req->present & XkbModifierMapMask) {
+         /* two bytes per non-zero modmap component */
+        _add_check_len(XkbPaddedSize(req->totalModMapKeys * sizeof(CARD16)));
+    }
+    /* vmodmap */
+    if (req->present & XkbVirtualModMapMask) {
+        _add_check_len(req->totalVModMapKeys * sz_xkbVModMapWireDesc);
+    }
+    if (len == req_len)
+        return Success;
+bad:
+    ErrorF("[xkb] BOGUS LENGTH in SetMap: expected %ld got %ld\n",
+           len, req_len);
+    return BadLength;
+}
+
+
 /**
  * Check if the given request can be applied to the given device but don't
  * actually do anything..
@@ -2639,6 +2726,11 @@
     CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
     CHK_MASK_LEGAL(0x01, stuff->present, XkbAllMapComponentsMask);
 
+    /* first verify the request length carefully */
+    rc = _XkbSetMapCheckLength(stuff);
+    if (rc != Success)
+        return rc;
+
     tmp = (char *) &stuff[1];
 
     /* Check if we can to the SetMap on the requested device. If this
@@ -6533,7 +6625,9 @@
                     unsigned changed,
                     int num,
                     int *status_rtrn,
-                    ClientPtr client, xkbExtensionDeviceNotify * ev)
+                    ClientPtr client,
+                    xkbExtensionDeviceNotify * ev,
+                    xkbSetDeviceInfoReq * stuff)
 {
     xkbDeviceLedsWireDesc *ledWire;
     int i;
@@ -6554,6 +6648,11 @@
         xkbIndicatorMapWireDesc *mapWire;
         XkbSrvLedInfoPtr sli;
 
+        if (!_XkbCheckRequestBounds(client, stuff, ledWire, ledWire + 1)) {
+            *status_rtrn = BadLength;
+            return (char *) ledWire;
+        }
+
         namec = mapc = statec = 0;
         sli = XkbFindSrvLedInfo(dev, ledWire->ledClass, ledWire->ledID,
                                 XkbXI_IndicatorMapsMask);
@@ -6572,6 +6671,10 @@
             memset((char *) sli->names, 0, XkbNumIndicators * sizeof(Atom));
             for (n = 0, bit = 1; n < XkbNumIndicators; n++, bit <<= 1) {
                 if (ledWire->namesPresent & bit) {
+                    if (!_XkbCheckRequestBounds(client, stuff, atomWire, 
atomWire + 1)) {
+                        *status_rtrn = BadLength;
+                        return (char *) atomWire;
+                    }
                     sli->names[n] = (Atom) *atomWire;
                     if (sli->names[n] == None)
                         ledWire->namesPresent &= ~bit;
@@ -6589,6 +6692,10 @@
         if (ledWire->mapsPresent) {
             for (n = 0, bit = 1; n < XkbNumIndicators; n++, bit <<= 1) {
                 if (ledWire->mapsPresent & bit) {
+                    if (!_XkbCheckRequestBounds(client, stuff, mapWire, 
mapWire + 1)) {
+                        *status_rtrn = BadLength;
+                        return (char *) mapWire;
+                    }
                     sli->maps[n].flags = mapWire->flags;
                     sli->maps[n].which_groups = mapWire->whichGroups;
                     sli->maps[n].groups = mapWire->groups;
@@ -6668,7 +6775,7 @@
     ed.deviceID = dev->id;
     wire = (char *) &stuff[1];
     if (stuff->change & XkbXI_ButtonActionsMask) {
-        int nBtns, sz, i;
+       int nBtns, sz, i;
         XkbAction *acts;
         DeviceIntPtr kbd;
 
@@ -6680,7 +6787,11 @@
                 return BadAlloc;
             dev->button->xkb_acts = acts;
         }
+        if (stuff->firstBtn + stuff->nBtns > nBtns)
+            return BadValue;
         sz = stuff->nBtns * SIZEOF(xkbActionWireDesc);
+        if (!_XkbCheckRequestBounds(client, stuff, wire, (char *) wire + sz))
+            return BadLength;
         memcpy((char *) &acts[stuff->firstBtn], (char *) wire, sz);
         wire += sz;
         ed.reason |= XkbXI_ButtonActionsMask;
@@ -6701,7 +6812,8 @@
         int status = Success;
 
         wire = SetDeviceIndicators(wire, dev, stuff->change,
-                                   stuff->nDeviceLedFBs, &status, client, &ed);
+                                   stuff->nDeviceLedFBs, &status, client, &ed,
+                                   stuff);
         if (status != Success)
             return status;
     }
_______________________________________________
openSUSE Commits mailing list -- commit@lists.opensuse.org
To unsubscribe, email commit-le...@lists.opensuse.org
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives: 
https://lists.opensuse.org/archives/list/commit@lists.opensuse.org

Reply via email to