Module Name:    xsrc
Committed By:   mrg
Date:           Sat Dec  5 20:34:05 UTC 2020

Modified Files:
        xsrc/external/mit/xorg-server/dist: configure configure.ac
        xsrc/external/mit/xorg-server/dist/Xi: xichangehierarchy.c
            xipassivegrab.c
        xsrc/external/mit/xorg-server/dist/dix: devices.c events.c
        xsrc/external/mit/xorg-server/dist/exa: exa_accel.c
        xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc: xf86DDC.h
        xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting:
            driver.c driver.h drmmode_display.c present.c vblank.c
        xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd:
            bsd_init.c
        xsrc/external/mit/xorg-server/dist/include: dix-config.h.in os.h
        xsrc/external/mit/xorg-server/dist/os: backtrace.c io.c
        xsrc/external/mit/xorg-server/dist/test/xi1:
            protocol-xchangedevicecontrol.c
        xsrc/external/mit/xorg-server/dist/test/xi2:
            protocol-xigetclientpointer.c protocol-xiquerypointer.c
            protocol-xiwarppointer.c
        xsrc/external/mit/xorg-server/dist/xkb: xkb.c
        xsrc/external/mit/xorg-server/include: dix-config.h

Log Message:
merge xorg-server 1.20.10.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 xsrc/external/mit/xorg-server/dist/configure
cvs rdiff -u -r1.9 -r1.10 xsrc/external/mit/xorg-server/dist/configure.ac
cvs rdiff -u -r1.5 -r1.6 \
    xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c
cvs rdiff -u -r1.4 -r1.5 \
    xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c
cvs rdiff -u -r1.10 -r1.11 xsrc/external/mit/xorg-server/dist/dix/devices.c
cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/xorg-server/dist/dix/events.c
cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/xorg-server/dist/exa/exa_accel.c
cvs rdiff -u -r1.3 -r1.4 \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h
cvs rdiff -u -r1.4 -r1.5 \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c
cvs rdiff -u -r1.5 -r1.6 \
    
xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c
 \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c
cvs rdiff -u -r1.10 -r1.11 \
    xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c
cvs rdiff -u -r1.5 -r1.6 \
    xsrc/external/mit/xorg-server/dist/include/dix-config.h.in
cvs rdiff -u -r1.9 -r1.10 xsrc/external/mit/xorg-server/dist/include/os.h
cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/xorg-server/dist/os/backtrace.c
cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/xorg-server/dist/os/io.c
cvs rdiff -u -r1.2 -r1.3 \
    xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c
cvs rdiff -u -r1.4 -r1.5 \
    xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c \
    xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c \
    xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c
cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/xorg-server/dist/xkb/xkb.c
cvs rdiff -u -r1.38 -r1.39 xsrc/external/mit/xorg-server/include/dix-config.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xorg-server/dist/configure
diff -u xsrc/external/mit/xorg-server/dist/configure:1.7 xsrc/external/mit/xorg-server/dist/configure:1.8
--- xsrc/external/mit/xorg-server/dist/configure:1.7	Sun Feb 23 10:26:21 2020
+++ xsrc/external/mit/xorg-server/dist/configure	Sat Dec  5 20:34:03 2020
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for xorg-server 1.20.6.
+# Generated by GNU Autoconf 2.69 for xorg-server 1.20.10.
 #
 # Report bugs to <https://gitlab.freedesktop.org/xorg/xserver/issues>.
 #
@@ -651,8 +651,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='xorg-server'
 PACKAGE_TARNAME='xorg-server'
-PACKAGE_VERSION='1.20.6'
-PACKAGE_STRING='xorg-server 1.20.6'
+PACKAGE_VERSION='1.20.10'
+PACKAGE_STRING='xorg-server 1.20.10'
 PACKAGE_BUGREPORT='https://gitlab.freedesktop.org/xorg/xserver/issues'
 PACKAGE_URL=''
 
@@ -947,6 +947,8 @@ PRESENT_FALSE
 PRESENT_TRUE
 GLX_SYS_LIBS
 GLX_DEFINES
+HASHTABLE_FALSE
+HASHTABLE_TRUE
 GLX_FALSE
 GLX_TRUE
 GL_LIBS
@@ -1236,6 +1238,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -1530,6 +1533,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1782,6 +1786,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1919,7 +1932,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -2032,7 +2045,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures xorg-server 1.20.6 to adapt to many kinds of systems.
+\`configure' configures xorg-server 1.20.10 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -2072,6 +2085,7 @@ Fine tuning of the installation director
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -2102,7 +2116,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of xorg-server 1.20.6:";;
+     short | recursive ) echo "Configuration of xorg-server 1.20.10:";;
    esac
   cat <<\_ACEOF
 
@@ -2293,10 +2307,10 @@ Optional Packages:
                           org.x)
   --with-bundle-version=VERSION
                           Version to use for X11.app's CFBundleVersion
-                          (default: 1.20.6)
+                          (default: 1.20.10)
   --with-bundle-version-string=VERSION
                           Version to use for X11.app's
-                          CFBundleShortVersionString (default: 1.20.6)
+                          CFBundleShortVersionString (default: 1.20.10)
   --with-sparkle-feed-url=URL
                           URL for the Sparkle feed (default:
                           https://www.xquartz.org/releases/sparkle/release.xml)
@@ -2553,7 +2567,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-xorg-server configure 1.20.6
+xorg-server configure 1.20.10
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -3262,7 +3276,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by xorg-server $as_me 1.20.6, which was
+It was created by xorg-server $as_me 1.20.10, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3610,8 +3624,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLA
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-RELEASE_DATE="2019-11-22"
-RELEASE_NAME="Enchiladas de Queso"
+RELEASE_DATE="2020-12-01"
+RELEASE_NAME="Chicken Pot Pie"
 
 
 am__api_version='1.16'
@@ -4129,7 +4143,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='xorg-server'
- VERSION='1.20.6'
+ VERSION='1.20.10'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -13896,6 +13910,11 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
   amigaos*)
     # On AmigaOS with pdksh, this test takes hours, literally.
     # So we just punt and use a minimum line length of 8192.
@@ -19877,11 +19896,11 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  library_names_spec='$libname$release$versuffix$shared_ext $libname$release$major$shared_ext $libname$shared_ext'
   soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  shrext_cmds='`test .$module = .yes && echo .bundle || echo .dylib`'
 
   sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
   sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
@@ -21691,10 +21710,9 @@ fi
 
 
 
-for ac_prog in cpp
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cpp", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cpp; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_RAWCPP+:} false; then :
@@ -21734,9 +21752,63 @@ $as_echo "no" >&6; }
 fi
 
 
-  test -n "$RAWCPP" && break
+fi
+if test -z "$ac_cv_path_RAWCPP"; then
+  ac_pt_RAWCPP=$RAWCPP
+  # Extract the first word of "cpp", so it can be a program name with args.
+set dummy cpp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_RAWCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_RAWCPP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_RAWCPP="$ac_pt_RAWCPP" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/bin:/usr/bin:/usr/lib:/usr/libexec:/usr/ccs/lib:/usr/ccs/lbin:/lib"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_RAWCPP="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
 done
-test -n "$RAWCPP" || RAWCPP="${CPP}"
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_RAWCPP=$ac_cv_path_ac_pt_RAWCPP
+if test -n "$ac_pt_RAWCPP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_RAWCPP" >&5
+$as_echo "$ac_pt_RAWCPP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_RAWCPP" = x; then
+    RAWCPP="${CPP}"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RAWCPP=$ac_pt_RAWCPP
+  fi
+else
+  RAWCPP="$ac_cv_path_RAWCPP"
+fi
 
 
 # Check for flag to avoid builtin definitions - assumes unix is predefined,
@@ -23706,7 +23778,7 @@ _ACEOF
 if test "${with_bundle_version+set}" = set; then :
   withval=$with_bundle_version;  BUNDLE_VERSION="${withval}"
 else
-   BUNDLE_VERSION="1.20.6"
+   BUNDLE_VERSION="1.20.10"
 fi
 
 
@@ -26326,6 +26398,7 @@ $as_echo "#define SCREENSAVER 1" >>confd
 	SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $SCRNSAVERPROTO"
 fi
 
+HASHTABLE=no
  if test "x$RES" = xyes; then
   RES_TRUE=
   RES_FALSE='#'
@@ -26338,6 +26411,7 @@ if test "x$RES" = xyes; then
 
 $as_echo "#define RES 1" >>confdefs.h
 
+	HASHTABLE=yes
 	REQUIRED_MODULES="$REQUIRED_MODULES $RESOURCEPROTO"
 	SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $RESOURCEPROTO"
 fi
@@ -27089,6 +27163,7 @@ fi
 
 $as_echo "#define GLXEXT 1" >>confdefs.h
 
+	HASHTABLE=yes
 	GLX_LIBS='$(top_builddir)/glx/libglx.la $(top_builddir)/glx/libglxvnd.la'
 	GLX_SYS_LIBS="$GLX_SYS_LIBS $GL_LIBS"
 else
@@ -27103,6 +27178,15 @@ else
 fi
 
 
+ if test "x$HASHTABLE" = xyes; then
+  HASHTABLE_TRUE=
+  HASHTABLE_FALSE='#'
+else
+  HASHTABLE_TRUE='#'
+  HASHTABLE_FALSE=
+fi
+
+
 
 
 
@@ -29943,6 +30027,17 @@ $as_echo "#define GLAMOR_HAS_EGL_QUERY_D
 
 fi
 
+	if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"epoxy >= 1.5.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "epoxy >= 1.5.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+
+$as_echo "#define GLAMOR_HAS_EGL_QUERY_DRIVER 1" >>confdefs.h
+
+fi
+
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GBM" >&5
@@ -32943,6 +33038,10 @@ if test -z "${GLX_TRUE}" && test -z "${G
   as_fn_error $? "conditional \"GLX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HASHTABLE_TRUE}" && test -z "${HASHTABLE_FALSE}"; then
+  as_fn_error $? "conditional \"HASHTABLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${PRESENT_TRUE}" && test -z "${PRESENT_FALSE}"; then
   as_fn_error $? "conditional \"PRESENT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -33532,7 +33631,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by xorg-server $as_me 1.20.6, which was
+This file was extended by xorg-server $as_me 1.20.10, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -33598,7 +33697,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-xorg-server config.status 1.20.6
+xorg-server config.status 1.20.10
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Index: xsrc/external/mit/xorg-server/dist/configure.ac
diff -u xsrc/external/mit/xorg-server/dist/configure.ac:1.9 xsrc/external/mit/xorg-server/dist/configure.ac:1.10
--- xsrc/external/mit/xorg-server/dist/configure.ac:1.9	Sun Feb 23 10:26:21 2020
+++ xsrc/external/mit/xorg-server/dist/configure.ac	Sat Dec  5 20:34:04 2020
@@ -26,9 +26,9 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.60)
-AC_INIT([xorg-server], 1.20.6, [https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
-RELEASE_DATE="2019-11-22"
-RELEASE_NAME="Enchiladas de Queso"
+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 @@ if test "x$SCREENSAVER" = xyes; then
 	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 @@ if test "x$GLX" = xyes; then
 	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 @@ else
 fi
 AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
 
+AM_CONDITIONAL(HASHTABLE, test "x$HASHTABLE" = xyes)
+
 AC_SUBST([GLX_DEFINES])
 AC_SUBST([GLX_SYS_LIBS])
 
@@ -2053,6 +2058,10 @@ if test "x$GLAMOR" = xyes; then
 			 [AC_DEFINE(GLAMOR_HAS_EGL_QUERY_DMABUF, 1, [Have GLAMOR_HAS_EGL_QUERY_DMABUF])],
 			 [])
 
+	PKG_CHECK_EXISTS(epoxy >= 1.5.4,
+			 [AC_DEFINE(GLAMOR_HAS_EGL_QUERY_DRIVER, 1, [Have GLAMOR_HAS_EGL_QUERY_DRIVER])],
+			 [])
+
 	PKG_CHECK_MODULES(GBM, "$LIBGBM", [GBM=yes], [GBM=no])
 	if test "x$GBM" = xyes; then
 		AC_DEFINE(GLAMOR_HAS_GBM, 1,

Index: xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c
diff -u xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.5 xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.6
--- xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.5	Mon Dec 31 09:49:58 2018
+++ xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c	Sat Dec  5 20:34:04 2020
@@ -423,7 +423,7 @@ ProcXIChangeHierarchy(ClientPtr client)
     if (!stuff->num_changes)
         return rc;
 
-    len = ((size_t)stuff->length << 2) - sizeof(xXIChangeHierarchyReq);
+    len = ((size_t)client->req_len << 2) - sizeof(xXIChangeHierarchyReq);
 
     any = (xXIAnyHierarchyChangeInfo *) &stuff[1];
     while (stuff->num_changes--) {

Index: xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c
diff -u xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.4 xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.5
--- xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.4	Mon Dec 31 09:49:58 2018
+++ xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c	Sat Dec  5 20:34:04 2020
@@ -203,8 +203,14 @@ ProcXIPassiveGrabDevice(ClientPtr client
                                 &param, XI2, &mask);
             break;
         case XIGrabtypeKeycode:
-            status = GrabKey(client, dev, mod_dev, stuff->detail,
-                             &param, XI2, &mask);
+            /* XI2 allows 32-bit keycodes but thanks to XKB we can never
+             * implement this. Just return an error for all keycodes that
+             * cannot work anyway */
+            if (stuff->detail > 255)
+                status = XIAlreadyGrabbed;
+            else
+                status = GrabKey(client, dev, mod_dev, stuff->detail,
+                                 &param, XI2, &mask);
             break;
         case XIGrabtypeEnter:
         case XIGrabtypeFocusIn:

Index: xsrc/external/mit/xorg-server/dist/dix/devices.c
diff -u xsrc/external/mit/xorg-server/dist/dix/devices.c:1.10 xsrc/external/mit/xorg-server/dist/dix/devices.c:1.11
--- xsrc/external/mit/xorg-server/dist/dix/devices.c:1.10	Mon Dec 31 09:49:59 2018
+++ xsrc/external/mit/xorg-server/dist/dix/devices.c	Sat Dec  5 20:34:04 2020
@@ -2656,7 +2656,7 @@ GetPairedDevice(DeviceIntPtr dev)
     if (!IsMaster(dev) && !IsFloating(dev))
         dev = GetMaster(dev, MASTER_ATTACHED);
 
-    return dev->spriteInfo->paired;
+    return dev->spriteInfo? dev->spriteInfo->paired: NULL;
 }
 
 /**

Index: xsrc/external/mit/xorg-server/dist/dix/events.c
diff -u xsrc/external/mit/xorg-server/dist/dix/events.c:1.4 xsrc/external/mit/xorg-server/dist/dix/events.c:1.5
--- xsrc/external/mit/xorg-server/dist/dix/events.c:1.4	Sun Feb 23 10:26:21 2020
+++ xsrc/external/mit/xorg-server/dist/dix/events.c	Sat Dec  5 20:34:04 2020
@@ -1532,7 +1532,9 @@ ActivatePointerGrab(DeviceIntPtr mouse, 
                 mouse->spriteInfo->sprite->hotPhys.y = 0;
         ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
     }
-    DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
+    if (! (grabinfo->grab && oldWin == grabinfo->grab->window
+			  && oldWin == grab->window))
+        DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
     mouse->valuator->motionHintWindow = NullWindow;
     if (syncEvents.playingEvents)
         grabinfo->grabTime = syncEvents.time;
@@ -1642,7 +1644,9 @@ ActivateKeyboardGrab(DeviceIntPtr keybd,
         oldWin = keybd->focus->win;
     if (keybd->valuator)
         keybd->valuator->motionHintWindow = NullWindow;
-    if (oldWin)
+    if (oldWin &&
+	! (grabinfo->grab && oldWin == grabinfo->grab->window
+			  && oldWin == grab->window))
         DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
     if (syncEvents.playingEvents)
         grabinfo->grabTime = syncEvents.time;

Index: xsrc/external/mit/xorg-server/dist/exa/exa_accel.c
diff -u xsrc/external/mit/xorg-server/dist/exa/exa_accel.c:1.5 xsrc/external/mit/xorg-server/dist/exa/exa_accel.c:1.6
--- xsrc/external/mit/xorg-server/dist/exa/exa_accel.c:1.5	Thu Aug 11 00:04:27 2016
+++ xsrc/external/mit/xorg-server/dist/exa/exa_accel.c	Sat Dec  5 20:34:04 2020
@@ -1037,7 +1037,7 @@ exaFillRegionSolid(DrawablePtr pDrawable
         if (pExaPixmap->pDamage &&
             pExaPixmap->sys_ptr && pDrawable->type == DRAWABLE_PIXMAP &&
             pDrawable->width == 1 && pDrawable->height == 1 &&
-            pDrawable->bitsPerPixel != 24) {
+            pDrawable->bitsPerPixel != 24 && alu == GXcopy) {
             RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage);
 
             switch (pDrawable->bitsPerPixel) {

Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h:1.3 xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h:1.4
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h:1.3	Thu Aug 11 00:04:29 2016
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/ddc/xf86DDC.h	Sat Dec  5 20:34:04 2020
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperti
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);
 
+extern _X_EXPORT Bool
+gtf_supported(xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);
 

Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c:1.4 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c:1.5
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c:1.4	Thu Jan 10 14:33:11 2019
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.c	Sat Dec  5 20:34:04 2020
@@ -41,6 +41,7 @@
 #include "compiler.h"
 #include "xf86Pci.h"
 #include "mipointer.h"
+#include "mipointrst.h"
 #include "micmap.h"
 #include <X11/extensions/randr.h>
 #include "fb.h"
@@ -131,6 +132,7 @@ static const OptionInfoRec Options[] = {
     {OPTION_PAGEFLIP, "PageFlip", OPTV_BOOLEAN, {0}, FALSE},
     {OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE},
     {OPTION_DOUBLE_SHADOW, "DoubleShadow", OPTV_BOOLEAN, {0}, FALSE},
+    {OPTION_ATOMIC, "Atomic", OPTV_BOOLEAN, {0}, FALSE},
     {-1, NULL, OPTV_NONE, {0}, FALSE}
 };
 
@@ -703,7 +705,7 @@ msBlockHandler_oneshot(ScreenPtr pScreen
 
     msBlockHandler(pScreen, pTimeout);
 
-    drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE);
+    drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE, FALSE);
 }
 
 static void
@@ -1038,8 +1040,12 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 #endif
     }
 
-    ret = drmSetClientCap(ms->fd, DRM_CLIENT_CAP_ATOMIC, 1);
-    ms->atomic_modeset = (ret == 0);
+    if (xf86ReturnOptValBool(ms->drmmode.Options, OPTION_ATOMIC, FALSE)) {
+        ret = drmSetClientCap(ms->fd, DRM_CLIENT_CAP_ATOMIC, 1);
+        ms->atomic_modeset = (ret == 0);
+    } else {
+        ms->atomic_modeset = FALSE;
+    }
 
     ms->kms_has_modifiers = FALSE;
     ret = drmGetCap(ms->fd, DRM_CAP_ADDFB2_MODIFIERS, &value);
@@ -1332,7 +1338,6 @@ static Bool
 CreateScreenResources(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen);
     modesettingPtr ms = modesettingPTR(pScrn);
     PixmapPtr rootPixmap;
     Bool ret;
@@ -1343,7 +1348,7 @@ CreateScreenResources(ScreenPtr pScreen)
     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))
@@ -1398,10 +1403,14 @@ CreateScreenResources(ScreenPtr pScreen)
         }
     }
 
-    pScrPriv->rrEnableSharedPixmapFlipping = msEnableSharedPixmapFlipping;
-    pScrPriv->rrDisableSharedPixmapFlipping = msDisableSharedPixmapFlipping;
+    if (dixPrivateKeyRegistered(rrPrivKey)) {
+        rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen);
 
-    pScrPriv->rrStartFlippingPixmapTracking = msStartFlippingPixmapTracking;
+        pScrPriv->rrEnableSharedPixmapFlipping = msEnableSharedPixmapFlipping;
+        pScrPriv->rrDisableSharedPixmapFlipping = msDisableSharedPixmapFlipping;
+
+        pScrPriv->rrStartFlippingPixmapTracking = msStartFlippingPixmapTracking;
+    }
 
     return ret;
 }
@@ -1648,6 +1657,21 @@ ScreenInit(ScreenPtr pScreen, int argc, 
     xf86SetSilkenMouse(pScreen);
     miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
 
+    /* If pageflip is enabled hook the screen's cursor-sprite (swcursor) funcs.
+     * So that we can disabe page-flipping on fallback to a swcursor. */
+    if (ms->drmmode.pageflip) {
+        miPointerScreenPtr PointPriv =
+            dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
+
+        if (!dixRegisterScreenPrivateKey(&ms->drmmode.spritePrivateKeyRec,
+                                         pScreen, PRIVATE_DEVICE,
+                                         sizeof(msSpritePrivRec)))
+            return FALSE;
+
+        ms->SpriteFuncs = PointPriv->spriteFuncs;
+        PointPriv->spriteFuncs = &drmmode_sprite_funcs;
+    }
+
     /* Need to extend HWcursor support to handle mask interleave */
     if (!ms->drmmode.sw_cursor)
         xf86_cursors_init(pScreen, ms->cursor_width, ms->cursor_height,
@@ -1796,8 +1820,25 @@ EnterVT(ScrnInfoPtr pScrn)
 
     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;
 }
@@ -1844,6 +1885,14 @@ CloseScreen(ScreenPtr pScreen)
 
     drmmode_free_bos(pScrn, &ms->drmmode);
 
+    if (ms->drmmode.pageflip) {
+        miPointerScreenPtr PointPriv =
+            dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
+
+        if (PointPriv->spriteFuncs == &drmmode_sprite_funcs)
+            PointPriv->spriteFuncs = ms->SpriteFuncs;        
+    }
+
     if (pScrn->vtSema) {
         LeaveVT(pScrn);
     }
Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h:1.4 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h:1.5
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h:1.4	Sun Feb 23 10:26:22 2020
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/driver.h	Sat Dec  5 20:34:04 2020
@@ -51,6 +51,7 @@ typedef enum {
     OPTION_PAGEFLIP,
     OPTION_ZAPHOD_HEADS,
     OPTION_DOUBLE_SHADOW,
+    OPTION_ATOMIC,
 } modesettingOpts;
 
 typedef struct
@@ -96,6 +97,7 @@ typedef struct _modesettingRec {
 
     CreateScreenResourcesProcPtr createScreenResources;
     ScreenBlockHandlerProcPtr BlockHandler;
+    miPointerSpriteFuncPtr SpriteFuncs;
     void *driver;
 
     drmmode_rec drmmode;
Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c:1.4 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c:1.5
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c:1.4	Sun Feb 23 10:26:22 2020
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/present.c	Sat Dec  5 20:34:04 2020
@@ -208,13 +208,17 @@ ms_present_flip_abort(modesettingPtr ms,
 
 /*
  * Test to see if page flipping is possible on the target crtc
+ *
+ * We ignore sw-cursors when *disabling* flipping, we may very well be
+ * returning to scanning out the normal framebuffer *because* we just
+ * switched to sw-cursor mode and check_flip just failed because of that.
  */
 static Bool
-ms_present_check_flip(RRCrtcPtr crtc,
-                      WindowPtr window,
-                      PixmapPtr pixmap,
-                      Bool sync_flip,
-                      PresentFlipReason *reason)
+ms_present_check_unflip(RRCrtcPtr crtc,
+                        WindowPtr window,
+                        PixmapPtr pixmap,
+                        Bool sync_flip,
+                        PresentFlipReason *reason)
 {
     ScreenPtr screen = window->drawable.pScreen;
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
@@ -281,6 +285,23 @@ ms_present_check_flip(RRCrtcPtr crtc,
     return TRUE;
 }
 
+static Bool
+ms_present_check_flip(RRCrtcPtr crtc,
+                      WindowPtr window,
+                      PixmapPtr pixmap,
+                      Bool sync_flip,
+                      PresentFlipReason *reason)
+{
+    ScreenPtr screen = window->drawable.pScreen;
+    ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+    modesettingPtr ms = modesettingPTR(scrn);
+
+    if (ms->drmmode.sprites_visible > 0)
+        return FALSE;
+
+    return ms_present_check_unflip(crtc, window, pixmap, sync_flip, reason);
+}
+
 /*
  * Queue a flip on 'crtc' to 'pixmap' at 'target_msc'. If 'sync_flip' is true,
  * then wait for vblank. Otherwise, flip immediately
@@ -343,7 +364,7 @@ ms_present_unflip(ScreenPtr screen, uint
     event->event_id = event_id;
     event->unflip = TRUE;
 
-    if (ms_present_check_flip(NULL, screen->root, pixmap, TRUE, NULL) &&
+    if (ms_present_check_unflip(NULL, screen->root, pixmap, TRUE, NULL) &&
         ms_do_pageflip(screen, pixmap, event, -1, FALSE,
                        ms_present_flip_handler, ms_present_flip_abort)) {
         return;

Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.5 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.6
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c:1.5	Sun Mar  3 22:01:08 2019
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/drmmode_display.c	Sat Dec  5 20:34:04 2020
@@ -34,8 +34,10 @@
 #include <sys/mman.h>
 #include <unistd.h>
 #include "dumb_bo.h"
+#include "inputstr.h"
 #include "xf86str.h"
 #include "X11/Xatom.h"
+#include "mi.h"
 #include "micmap.h"
 #include "xf86cmap.h"
 #include "xf86DDC.h"
@@ -754,6 +756,7 @@ drmmode_crtc_set_mode(xf86CrtcPtr crtc, 
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
     drmmode_ptr drmmode = drmmode_crtc->drmmode;
+    ScreenPtr screen = crtc->scrn->pScreen;
     drmModeModeInfo kmode;
     int output_count = 0;
     uint32_t *output_ids = NULL;
@@ -764,6 +767,12 @@ drmmode_crtc_set_mode(xf86CrtcPtr crtc, 
     if (!drmmode_crtc_get_fb_id(crtc, &fb_id, &x, &y))
         return 1;
 
+#ifdef GLAMOR_HAS_GBM
+    /* Make sure any pending drawing will be visible in a new scanout buffer */
+    if (drmmode->glamor)
+        glamor_finish(screen);
+#endif
+
     if (ms->atomic_modeset) {
         drmModeAtomicReq *req = drmModeAtomicAlloc();
         Bool active;
@@ -1452,8 +1461,6 @@ drmmode_copy_fb(ScrnInfoPtr pScrn, drmmo
 
     FreeScratchGC(gc);
 
-    glamor_finish(pScreen);
-
     pScreen->canDoBGNoneRoot = TRUE;
 
     if (drmmode->fbcon_pixmap)
@@ -1794,6 +1801,19 @@ drmmode_set_scanout_pixmap(xf86CrtcPtr c
                                              &drmmode_crtc->prime_pixmap);
 }
 
+static void
+drmmode_clear_pixmap(PixmapPtr pixmap)
+{
+    ScreenPtr screen = pixmap->drawable.pScreen;
+    GCPtr gc;
+
+    gc = GetScratchGC(pixmap->drawable.depth, screen);
+    if (gc) {
+        miClearDrawable(&pixmap->drawable, gc);
+        FreeScratchGC(gc);
+    }
+}
+
 static void *
 drmmode_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
 {
@@ -2423,7 +2443,7 @@ drmmode_output_add_gtf_modes(xf86OutputP
     int max_x = 0, max_y = 0;
     float max_vrefresh = 0.0;
 
-    if (mon && GTF_SUPPORTED(mon->features.msc))
+    if (mon && gtf_supported(mon))
         return Modes;
 
     if (!has_panel_fitter(output))
@@ -3178,6 +3198,8 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn
     if (!drmmode_glamor_handle_new_screen_pixmap(drmmode))
         goto fail;
 
+    drmmode_clear_pixmap(ppix);
+
     for (i = 0; i < xf86_config->num_crtc; i++) {
         xf86CrtcPtr crtc = xf86_config->crtc[i];
 
@@ -3188,10 +3210,10 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn
                                crtc->rotation, crtc->x, crtc->y);
     }
 
-    if (old_fb_id) {
+    if (old_fb_id)
         drmModeRmFB(drmmode->fd, old_fb_id);
-        drmmode_bo_destroy(drmmode, &old_front);
-    }
+
+    drmmode_bo_destroy(drmmode, &old_front);
 
     return TRUE;
 
@@ -3210,13 +3232,19 @@ static void
 drmmode_validate_leases(ScrnInfoPtr scrn)
 {
     ScreenPtr screen = scrn->pScreen;
-    rrScrPrivPtr scr_priv = rrGetScrPriv(screen);
+    rrScrPrivPtr scr_priv;
     modesettingPtr ms = modesettingPTR(scrn);
     drmmode_ptr drmmode = &ms->drmmode;
     drmModeLesseeListPtr lessees;
     RRLeasePtr lease, next;
     int l;
 
+    /* Bail out if RandR wasn't initialized. */
+    if (!dixPrivateKeyRegistered(rrPrivKey))
+        return;
+
+    scr_priv = rrGetScrPriv(screen);
+
     /* We can't talk to the kernel about leases when VT switched */
     if (!scrn->vtSema)
         return;
@@ -3433,9 +3461,11 @@ drmmode_adjust_frame(ScrnInfoPtr pScrn, 
 }
 
 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++) {
@@ -3483,8 +3513,17 @@ drmmode_set_desired_modes(ScrnInfoPtr pS
         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;
@@ -3498,7 +3537,7 @@ drmmode_set_desired_modes(ScrnInfoPtr pS
     /* Validate leases on VT re-entry */
     drmmode_validate_leases(pScrn);
 
-    return TRUE;
+    return success;
 }
 
 static void
@@ -3583,30 +3622,19 @@ drmmode_setup_colormap(ScreenPtr pScreen
     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
@@ -3654,7 +3682,7 @@ drmmode_handle_uevents(int fd, void *clo
         goto out;
 
     if (mode_res->count_crtcs != config->num_crtc) {
-        ErrorF("number of CRTCs changed - failed to handle, %d vs %d\n", mode_res->count_crtcs, config->num_crtc);
+        /* this triggers with Zaphod mode where we don't currently support connector hotplug or MST. */
         goto out_free_res;
     }
 
@@ -3703,15 +3731,16 @@ drmmode_handle_uevents(int fd, void *clo
         drmmode_output_init(scrn, drmmode, mode_res, i, TRUE, 0);
     }
 
-    /* Check to see if a lessee has disappeared */
-    drmmode_validate_leases(scrn);
-
     if (changed) {
         RRSetChanged(xf86ScrnToScreen(scrn));
         RRTellChanged(xf86ScrnToScreen(scrn));
     }
 
 out_free_res:
+
+    /* Check to see if a lessee has disappeared */
+    drmmode_validate_leases(scrn);
+
     drmModeFreeResources(mode_res);
 out:
     RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
@@ -3720,6 +3749,25 @@ out:
 #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
@@ -3914,3 +3962,102 @@ drmmode_get_default_bpp(ScrnInfoPtr pScr
     drmModeFreeResources(mode_res);
     return;
 }
+
+/*
+ * We hook the screen's cursor-sprite (swcursor) functions to see if a swcursor
+ * is active. When a swcursor is active we disabe page-flipping.
+ */
+
+static void drmmode_sprite_do_set_cursor(msSpritePrivPtr sprite_priv,
+                                         ScrnInfoPtr scrn, int x, int y)
+{
+    modesettingPtr ms = modesettingPTR(scrn);
+    CursorPtr cursor = sprite_priv->cursor;
+    Bool sprite_visible = sprite_priv->sprite_visible;
+
+    if (cursor) {
+        x -= cursor->bits->xhot;
+        y -= cursor->bits->yhot;
+
+        sprite_priv->sprite_visible =
+            x < scrn->virtualX && y < scrn->virtualY &&
+            (x + cursor->bits->width > 0) &&
+            (y + cursor->bits->height > 0);
+    } else {
+        sprite_priv->sprite_visible = FALSE;
+    }
+
+    ms->drmmode.sprites_visible += sprite_priv->sprite_visible - sprite_visible;
+}
+
+static void drmmode_sprite_set_cursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                                      CursorPtr pCursor, int x, int y)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+    msSpritePrivPtr sprite_priv = msGetSpritePriv(pDev, ms, pScreen);
+
+    sprite_priv->cursor = pCursor;
+    drmmode_sprite_do_set_cursor(sprite_priv, scrn, x, y);
+
+    ms->SpriteFuncs->SetCursor(pDev, pScreen, pCursor, x, y);
+}
+
+static void drmmode_sprite_move_cursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                                       int x, int y)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+    msSpritePrivPtr sprite_priv = msGetSpritePriv(pDev, ms, pScreen);
+
+    drmmode_sprite_do_set_cursor(sprite_priv, scrn, x, y);
+
+    ms->SpriteFuncs->MoveCursor(pDev, pScreen, x, y);
+}
+
+static Bool drmmode_sprite_realize_realize_cursor(DeviceIntPtr pDev,
+                                                  ScreenPtr pScreen,
+                                                  CursorPtr pCursor)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+
+    return ms->SpriteFuncs->RealizeCursor(pDev, pScreen, pCursor);
+}
+
+static Bool drmmode_sprite_realize_unrealize_cursor(DeviceIntPtr pDev,
+                                                    ScreenPtr pScreen,
+                                                    CursorPtr pCursor)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+
+    return ms->SpriteFuncs->UnrealizeCursor(pDev, pScreen, pCursor);
+}
+
+static Bool drmmode_sprite_device_cursor_initialize(DeviceIntPtr pDev,
+                                                    ScreenPtr pScreen)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+
+    return ms->SpriteFuncs->DeviceCursorInitialize(pDev, pScreen);
+}
+
+static void drmmode_sprite_device_cursor_cleanup(DeviceIntPtr pDev,
+                                                 ScreenPtr pScreen)
+{
+    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+    modesettingPtr ms = modesettingPTR(scrn);
+
+    ms->SpriteFuncs->DeviceCursorCleanup(pDev, pScreen);
+}
+
+miPointerSpriteFuncRec drmmode_sprite_funcs = {
+    .RealizeCursor = drmmode_sprite_realize_realize_cursor,
+    .UnrealizeCursor = drmmode_sprite_realize_unrealize_cursor,
+    .SetCursor = drmmode_sprite_set_cursor,
+    .MoveCursor = drmmode_sprite_move_cursor,
+    .DeviceCursorInitialize = drmmode_sprite_device_cursor_initialize,
+    .DeviceCursorCleanup = drmmode_sprite_device_cursor_cleanup,
+};
Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c:1.5 xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c:1.6
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c:1.5	Sun Feb 23 10:26:22 2020
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/drivers/modesetting/vblank.c	Sat Dec  5 20:34:04 2020
@@ -220,7 +220,7 @@ static RRCrtcPtr
 ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
 {
     ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
-    rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen);
+    rrScrPrivPtr pScrPriv;
     RRCrtcPtr crtc, best_crtc;
     int coverage, best_coverage;
     int c;
@@ -230,6 +230,11 @@ ms_covering_randr_crtc(ScreenPtr pScreen
     best_crtc = NULL;
     best_coverage = 0;
 
+    if (!dixPrivateKeyRegistered(rrPrivKey))
+        return NULL;
+
+    pScrPriv = rrGetScrPriv(pScreen);
+
     if (!pScrPriv)
         return NULL;
 

Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c
diff -u xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c:1.10 xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c:1.11
--- xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c:1.10	Mon Dec 31 09:50:01 2018
+++ xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.c	Sat Dec  5 20:34:04 2020
@@ -659,3 +659,9 @@ xf86UseMsg()
     ErrorF("don't detach controlling tty (for debugging only)\n");
     return;
 }
+
+void
+xf86OSInputThreadInit(void)
+{
+    return;
+}

Index: xsrc/external/mit/xorg-server/dist/include/dix-config.h.in
diff -u xsrc/external/mit/xorg-server/dist/include/dix-config.h.in:1.5 xsrc/external/mit/xorg-server/dist/include/dix-config.h.in:1.6
--- xsrc/external/mit/xorg-server/dist/include/dix-config.h.in:1.5	Sun Feb 23 10:26:22 2020
+++ xsrc/external/mit/xorg-server/dist/include/dix-config.h.in	Sat Dec  5 20:34:04 2020
@@ -488,6 +488,9 @@
 /* Glamor can use eglQueryDmaBuf* functions */
 #undef GLAMOR_HAS_EGL_QUERY_DMABUF
 
+/* Glamor can use EGL_MESA_query_driver functions */
+#undef GLAMOR_HAS_EGL_QUERY_DRIVER
+
 /* byte order */
 #undef X_BYTE_ORDER
 

Index: xsrc/external/mit/xorg-server/dist/include/os.h
diff -u xsrc/external/mit/xorg-server/dist/include/os.h:1.9 xsrc/external/mit/xorg-server/dist/include/os.h:1.10
--- xsrc/external/mit/xorg-server/dist/include/os.h:1.9	Mon Dec 31 09:50:02 2018
+++ xsrc/external/mit/xorg-server/dist/include/os.h	Sat Dec  5 20:34:04 2020
@@ -569,6 +569,8 @@ extern _X_EXPORT void
 AbortDDX(enum ExitCode error);
 extern _X_EXPORT void
 ddxGiveUp(enum ExitCode error);
+extern _X_EXPORT void
+ddxInputThreadInit(void);
 extern _X_EXPORT int
 TimeSinceLastInputEvent(void);
 

Index: xsrc/external/mit/xorg-server/dist/os/backtrace.c
diff -u xsrc/external/mit/xorg-server/dist/os/backtrace.c:1.2 xsrc/external/mit/xorg-server/dist/os/backtrace.c:1.3
--- xsrc/external/mit/xorg-server/dist/os/backtrace.c:1.2	Wed May 15 18:29:21 2019
+++ xsrc/external/mit/xorg-server/dist/os/backtrace.c	Sat Dec  5 20:34:04 2020
@@ -45,6 +45,7 @@ xorg_backtrace(void)
 {
     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 @@ xorg_backtrace(void)
             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 @@ xorg_backtrace(void)
 
         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)

Index: xsrc/external/mit/xorg-server/dist/os/io.c
diff -u xsrc/external/mit/xorg-server/dist/os/io.c:1.4 xsrc/external/mit/xorg-server/dist/os/io.c:1.5
--- xsrc/external/mit/xorg-server/dist/os/io.c:1.4	Mon Dec 31 09:50:02 2018
+++ xsrc/external/mit/xorg-server/dist/os/io.c	Sat Dec  5 20:34:04 2020
@@ -559,6 +559,11 @@ void
 ResetCurrentRequest(ClientPtr client)
 {
     OsCommPtr oc = (OsCommPtr) client->osPrivate;
+
+    /* ignore dying clients */
+    if (!oc)
+        return;
+
     register ConnectionInputPtr oci = oc->input;
     register xReq *request;
     int gotnow, needed;

Index: xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c
diff -u xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c:1.2 xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c:1.3
--- xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c:1.2	Mon Dec 31 09:50:03 2018
+++ xsrc/external/mit/xorg-server/dist/test/xi1/protocol-xchangedevicecontrol.c	Sat Dec  5 20:34:05 2020
@@ -37,7 +37,7 @@
 
 #include "protocol-common.h"
 
-ClientRec client_window;
+extern ClientRec client_window;
 static ClientRec client_request;
 
 static void

Index: xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c
diff -u xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c:1.4 xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c:1.5
--- xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c:1.4	Mon Dec 31 09:50:03 2018
+++ xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xigetclientpointer.c	Sat Dec  5 20:34:05 2020
@@ -46,7 +46,7 @@ static struct {
     int win;
 } test_data;
 
-ClientRec client_window;
+extern ClientRec client_window;
 static ClientRec client_request;
 
 static void
Index: xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c
diff -u xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c:1.4 xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c:1.5
--- xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c:1.4	Mon Dec 31 09:50:03 2018
+++ xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiquerypointer.c	Sat Dec  5 20:34:05 2020
@@ -41,7 +41,7 @@
 
 #include "protocol-common.h"
 
-ClientRec client_window;
+extern ClientRec client_window;
 static ClientRec client_request;
 static void reply_XIQueryPointer_data(ClientPtr client, int len,
                                       char *data, void *closure);
Index: xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c
diff -u xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c:1.4 xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c:1.5
--- xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c:1.4	Mon Dec 31 09:50:03 2018
+++ xsrc/external/mit/xorg-server/dist/test/xi2/protocol-xiwarppointer.c	Sat Dec  5 20:34:05 2020
@@ -44,7 +44,7 @@
 static int expected_x = SPRITE_X;
 static int expected_y = SPRITE_Y;
 
-ClientRec client_window;
+extern ClientRec client_window;
 
 /**
  * This function overrides the one in the screen rec.

Index: xsrc/external/mit/xorg-server/dist/xkb/xkb.c
diff -u xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.5 xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.6
--- xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.5	Sun Feb 23 10:26:23 2020
+++ xsrc/external/mit/xorg-server/dist/xkb/xkb.c	Sat Dec  5 20:34:05 2020
@@ -152,6 +152,19 @@ static RESTYPE RT_XKBCLIENT;
 #define	CHK_REQ_KEY_RANGE(err,first,num,r)  \
 	CHK_REQ_KEY_RANGE2(err,first,num,r,client->errorValue,BadValue)
 
+static Bool
+_XkbCheckRequestBounds(ClientPtr client, void *stuff, void *from, void *to) {
+    char *cstuff = (char *)stuff;
+    char *cfrom = (char *)from;
+    char *cto = (char *)to;
+
+    return cfrom < cto &&
+           cfrom >= cstuff &&
+           cfrom < cstuff + ((size_t)client->req_len << 2) &&
+           cto >= cstuff &&
+           cto <= cstuff + ((size_t)client->req_len << 2);
+}
+
 /***====================================================================***/
 
 int
@@ -2369,6 +2382,93 @@ SetVirtualModMap(XkbSrvInfoPtr xkbi,
     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..
@@ -2626,6 +2726,11 @@ ProcXkbSetMap(ClientPtr client)
     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
@@ -4045,6 +4150,8 @@ _XkbSetNamesCheck(ClientPtr client, Devi
             client->errorValue = _XkbErrCode2(0x04, stuff->firstType);
             return BadAccess;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + stuff->nTypes))
+            return BadLength;
         old = tmp;
         tmp = _XkbCheckAtoms(tmp, stuff->nTypes, client->swapped, &bad);
         if (!tmp) {
@@ -4074,6 +4181,8 @@ _XkbSetNamesCheck(ClientPtr client, Devi
         }
         width = (CARD8 *) tmp;
         tmp = (CARD32 *) (((char *) tmp) + XkbPaddedSize(stuff->nKTLevels));
+        if (!_XkbCheckRequestBounds(client, stuff, width, tmp))
+            return BadLength;
         type = &xkb->map->types[stuff->firstKTLevel];
         for (i = 0; i < stuff->nKTLevels; i++, type++) {
             if (width[i] == 0)
@@ -4083,6 +4192,8 @@ _XkbSetNamesCheck(ClientPtr client, Devi
                                                   type->num_levels, width[i]);
                 return BadMatch;
             }
+            if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + width[i]))
+                return BadLength;
             tmp = _XkbCheckAtoms(tmp, width[i], client->swapped, &bad);
             if (!tmp) {
                 client->errorValue = bad;
@@ -4095,6 +4206,9 @@ _XkbSetNamesCheck(ClientPtr client, Devi
             client->errorValue = 0x08;
             return BadMatch;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp,
+                                    tmp + Ones(stuff->indicators)))
+            return BadLength;
         tmp = _XkbCheckMaskedAtoms(tmp, XkbNumIndicators, stuff->indicators,
                                    client->swapped, &bad);
         if (!tmp) {
@@ -4107,6 +4221,9 @@ _XkbSetNamesCheck(ClientPtr client, Devi
             client->errorValue = 0x09;
             return BadMatch;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp,
+                                    tmp + Ones(stuff->virtualMods)))
+            return BadLength;
         tmp = _XkbCheckMaskedAtoms(tmp, XkbNumVirtualMods,
                                    (CARD32) stuff->virtualMods,
                                    client->swapped, &bad);
@@ -4120,6 +4237,9 @@ _XkbSetNamesCheck(ClientPtr client, Devi
             client->errorValue = 0x0a;
             return BadMatch;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp,
+                                    tmp + Ones(stuff->groupNames)))
+            return BadLength;
         tmp = _XkbCheckMaskedAtoms(tmp, XkbNumKbdGroups,
                                    (CARD32) stuff->groupNames,
                                    client->swapped, &bad);
@@ -4141,9 +4261,14 @@ _XkbSetNamesCheck(ClientPtr client, Devi
                              stuff->nKeys);
             return BadValue;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + stuff->nKeys))
+            return BadLength;
         tmp += stuff->nKeys;
     }
     if ((stuff->which & XkbKeyAliasesMask) && (stuff->nKeyAliases > 0)) {
+        if (!_XkbCheckRequestBounds(client, stuff, tmp,
+                                    tmp + (stuff->nKeyAliases * 2)))
+            return BadLength;
         tmp += stuff->nKeyAliases * 2;
     }
     if (stuff->which & XkbRGNamesMask) {
@@ -4151,6 +4276,9 @@ _XkbSetNamesCheck(ClientPtr client, Devi
             client->errorValue = _XkbErrCode2(0x0d, stuff->nRadioGroups);
             return BadValue;
         }
+        if (!_XkbCheckRequestBounds(client, stuff, tmp,
+                                    tmp + stuff->nRadioGroups))
+            return BadLength;
         tmp = _XkbCheckAtoms(tmp, stuff->nRadioGroups, client->swapped, &bad);
         if (!tmp) {
             client->errorValue = bad;
@@ -4344,6 +4472,8 @@ ProcXkbSetNames(ClientPtr client)
     /* check device-independent stuff */
     tmp = (CARD32 *) &stuff[1];
 
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbKeycodesNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -4351,6 +4481,8 @@ ProcXkbSetNames(ClientPtr client)
             return BadAtom;
         }
     }
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbGeometryNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -4358,6 +4490,8 @@ ProcXkbSetNames(ClientPtr client)
             return BadAtom;
         }
     }
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbSymbolsNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -4365,6 +4499,8 @@ ProcXkbSetNames(ClientPtr client)
             return BadAtom;
         }
     }
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbPhysSymbolsNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -4372,6 +4508,8 @@ ProcXkbSetNames(ClientPtr client)
             return BadAtom;
         }
     }
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbTypesNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -4379,6 +4517,8 @@ ProcXkbSetNames(ClientPtr client)
             return BadAtom;
         }
     }
+    if (!_XkbCheckRequestBounds(client, stuff, tmp, tmp + 1))
+        return BadLength;
     if (stuff->which & XkbCompatNameMask) {
         tmp = _XkbCheckAtoms(tmp, 1, client->swapped, &bad);
         if (!tmp) {
@@ -6485,7 +6625,9 @@ SetDeviceIndicators(char *wire,
                     unsigned changed,
                     int num,
                     int *status_rtrn,
-                    ClientPtr client, xkbExtensionDeviceNotify * ev)
+                    ClientPtr client,
+                    xkbExtensionDeviceNotify * ev,
+                    xkbSetDeviceInfoReq * stuff)
 {
     xkbDeviceLedsWireDesc *ledWire;
     int i;
@@ -6506,6 +6648,11 @@ SetDeviceIndicators(char *wire,
         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);
@@ -6524,6 +6671,10 @@ SetDeviceIndicators(char *wire,
             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;
@@ -6541,6 +6692,10 @@ SetDeviceIndicators(char *wire,
         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;
@@ -6620,7 +6775,7 @@ _XkbSetDeviceInfoCheck(ClientPtr client,
     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;
 
@@ -6632,7 +6787,11 @@ _XkbSetDeviceInfoCheck(ClientPtr client,
                 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;
@@ -6653,7 +6812,8 @@ _XkbSetDeviceInfoCheck(ClientPtr client,
         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;
     }

Index: xsrc/external/mit/xorg-server/include/dix-config.h
diff -u xsrc/external/mit/xorg-server/include/dix-config.h:1.38 xsrc/external/mit/xorg-server/include/dix-config.h:1.39
--- xsrc/external/mit/xorg-server/include/dix-config.h:1.38	Sun Feb 23 10:42:56 2020
+++ xsrc/external/mit/xorg-server/include/dix-config.h	Sat Dec  5 20:34:05 2020
@@ -497,9 +497,13 @@
 /* GBM has modifiers support */
 /* #undef GBM_BO_WITH_MODIFIERS */
 
+/* XXXMRG check this and query driver */
 /* Glamor can use eglQueryDmaBuf* functions */
 /* #undef GLAMOR_HAS_EGL_QUERY_DMABUF */
 
+/* Glamor can use EGL_MESA_query_driver functions */
+/* #undef GLAMOR_HAS_EGL_QUERY_DRIVER */
+
 #if 0
 /* byte order */
 #define X_BYTE_ORDER X_LITTLE_ENDIAN

Reply via email to