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 @@ ®istry_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