Find a file
Keith Packard 30ccef3a48 Avoid recursing through _XError due to sequence adjustment
This patch is based on research done by Dmitry Osipenko to uncover the
cause of a large class of Xlib lockups.

_XError must unlock and re-lock the display around the call to the
user error handler function. When re-locking the display, two
functions are called to ensure that the display is ready to generate a request:

    _XIDHandler(dpy);
    _XSeqSyncFunction(dpy);

The first ensures that there is at least one XID available to use
(possibly calling _xcb_generate_id to do so). The second makes sure a
reply is received at least every 65535 requests to keep sequence
numbers in sync (possibly generating a GetInputFocus request and
synchronously awaiting the reply).

If the second of these does generate a GetInputFocus request and wait
for the reply, then a pending error will cause recursion into _XError,
which deadlocks the display.

One seemingly easy fix is to have _XError avoid those calls by
invoking InternalLockDisplay instead of LockDisplay. That function
does everything that LockDisplay does *except* call those final two
functions which may end up receiving an error.

However, that doesn't protect the system from applications which call
some legal Xlib function from within their error handler. Any Xlib
function which cannot generate protocol or wait for events is valid,
including many which invoke LockDisplay.

What we need to do is make LockDisplay skip these two function calls
precisely when it is called from within the _XError context for the
same display.

This patch accomplishes this by creating a list of threads in the
display which are in _XError, and then having LockDisplay check the
current thread against those list elements.

Inspired-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Tested-by: Dmitry Osipenko <digetx@gmail.com>
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
2020-11-15 10:09:16 -08:00
include Avoid recursing through _XError due to sequence adjustment 2020-11-15 10:09:16 -08:00
m4 Use __builtin_popcountl if available to replace Ones() in GetImage.c 2020-09-28 16:16:07 -07:00
man Add XSetIOErrorExitHandler() function 2020-10-15 11:14:53 +02:00
modules i18n: use memcpy instead of strncpy on unterminated char arrays 2020-08-28 20:29:27 +00:00
nls nls: improve the comments for the Serbian compose sequences 2020-11-13 17:01:02 +00:00
specs Fix spelling/wording issues 2020-07-22 15:19:58 -07:00
src Avoid recursing through _XError due to sequence adjustment 2020-11-15 10:09:16 -08:00
.gitignore Ignore test-driver (used by newer autoconf). 2015-07-19 23:01:05 +02:00
AUTHORS libX11 1.5.0 2012-06-01 23:37:09 -07:00
autogen.sh autogen: add default patch prefix 2017-01-26 13:52:49 +10:00
configure.ac nls: rename the obsolete sr_CS locale to sr_RS 2020-11-13 17:01:02 +00:00
COPYING Bug 19379 - Provide docs with overview of all compose key combinations 2010-09-21 18:22:21 -07:00
cpprules.in cpprules.in: squash whitespace in generated files 2020-10-10 21:35:04 +00:00
docbook.am docbook.am: embed css styles inside the HTML HEAD element 2011-12-30 17:08:14 -05:00
Makefile.am Update README for gitlab migration 2018-11-19 21:26:23 -08:00
NEWS Move security fixes to the top of NEWS, and fix spacing. 2007-06-03 21:41:47 -07:00
README.md Fix spelling/wording issues 2020-07-22 15:19:58 -07:00
x11-xcb.pc.in Split public Xlib/XCB functions into libX11-xcb 2006-10-05 17:44:22 -07:00
x11.pc.in Bug 15664: xau & xdmcp not needed in x11.pc dependencies when built with xcb 2009-03-12 17:11:42 -07:00

libX11 - Core X11 protocol client library

Documentation for this library can be found in the included man pages, and in the Xlib spec from the specs subdirectory, also available at:

https://www.x.org/releases/current/doc/libX11/libX11/libX11.html https://www.x.org/releases/current/doc/libX11/libX11/libX11.pdf

and the O'Reilly Xlib books, which they have made freely available online, though only for older versions of X11:

All questions regarding this software should be directed at the Xorg mailing list:

https://lists.x.org/mailman/listinfo/xorg

The primary development code repository can be found at:

https://gitlab.freedesktop.org/xorg/lib/libX11

Please submit bug reports and requests to merge patches there.

For patch submission instructions, see:

https://www.x.org/wiki/Development/Documentation/SubmittingPatches