diff options
author | V3n3RiX <venerix@koprulu.sector> | 2022-09-09 18:55:58 +0100 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2022-09-09 18:55:58 +0100 |
commit | d674e773afec7568a84545d10eb3e4100aaf4d9f (patch) | |
tree | e808fe3e044c54b0fef6835731ec99137b5ff854 /x11-libs | |
parent | c21d314ef74dd80392914fb24131d9e157dc4eb0 (diff) |
x11-libs/libX11 : bugfix ( https://gitlab.freedesktop.org/xorg/lib/libx11/-/issues/157 )
Diffstat (limited to 'x11-libs')
-rw-r--r-- | x11-libs/libX11/Manifest | 1 | ||||
-rw-r--r-- | x11-libs/libX11/files/150.patch | 175 | ||||
-rw-r--r-- | x11-libs/libX11/libX11-1.8.1-r10.ebuild | 46 |
3 files changed, 222 insertions, 0 deletions
diff --git a/x11-libs/libX11/Manifest b/x11-libs/libX11/Manifest new file mode 100644 index 00000000..5a548468 --- /dev/null +++ b/x11-libs/libX11/Manifest @@ -0,0 +1 @@ +DIST libX11-1.8.1.tar.xz 1818460 BLAKE2B 7602b4d8c65ea3160f81096b4e022b5462e49d96b36dee70fe06e972329dc9d70bbd462e2079da03ba5647d7a72bf03e29aab23c60bcc206c95d770655622226 SHA512 2e36d2c47519e0cb2697f588c0ccdf73fbe75c2163f0855c78f7052dc9e920bca081f9d5e39c707a14067f101faef74fc758c8862eeba675b1535b43119d533a diff --git a/x11-libs/libX11/files/150.patch b/x11-libs/libX11/files/150.patch new file mode 100644 index 00000000..1c3b6bd7 --- /dev/null +++ b/x11-libs/libX11/files/150.patch @@ -0,0 +1,175 @@ +From 8808d16b0bc53e6c1e235d2fc714145b9adcf626 Mon Sep 17 00:00:00 2001 +From: Adam Jackson <ajax@redhat.com> +Date: Fri, 5 Aug 2022 15:19:08 -0400 +Subject: [PATCH] Allow X*IfEvent() to reenter libX11 + +The documentation for this family of functions very clearly says not to +call into xlib in your predicate function, but historically single +threaded apps could get away with it just fine, and now that we've +forced thread-safety on the world such apps will now deadlock instead. +That's not an acceptable regression even if the app is technically +broken. This has been reported with XFCE and FVWM, and Motif's +cut-and-paste code has the same bug by inspection, so this does need to +be addressed. + +This change nerfs LockDisplay/UnlockDisplay while inside the critical +bit of an IfEvent function. This is still safe in the sense that the +display remains locked and no other thread should be able to change it +from under us, but the loop that scans the event queue might not be +robust against it being modified as a side effect of protocol emitted by +the predicate callback. But that's not new, non-XInitThreads'd xlib +would have the same caveat. + +Closes: xorg/lib/libx11#157 +--- + include/X11/Xlibint.h | 1 + + src/ChkIfEv.c | 3 +++ + src/IfEvent.c | 2 ++ + src/OpenDis.c | 1 + + src/PeekIfEv.c | 2 ++ + src/locking.c | 30 ++++++++++++++++++++++++++++++ + 6 files changed, 39 insertions(+) + +diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h +index 6d880a65..46c9ac11 100644 +--- a/include/X11/Xlibint.h ++++ b/include/X11/Xlibint.h +@@ -207,6 +207,7 @@ struct _XDisplay + + XIOErrorExitHandler exit_handler; + void *exit_handler_data; ++ Bool in_ifevent; + }; + + #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) +diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c +index 876a850e..327b5eaf 100644 +--- a/src/ChkIfEv.c ++++ b/src/ChkIfEv.c +@@ -50,6 +50,7 @@ Bool XCheckIfEvent ( + int n; /* time through count */ + + LockDisplay(dpy); ++ dpy->in_ifevent = True; + prev = NULL; + for (n = 3; --n >= 0;) { + for (qelt = prev ? prev->next : dpy->head; +@@ -60,6 +61,7 @@ Bool XCheckIfEvent ( + *event = qelt->event; + _XDeq(dpy, prev, qelt); + _XStoreEventCookie(dpy, event); ++ dpy->in_ifevent = False; + UnlockDisplay(dpy); + return True; + } +@@ -78,6 +80,7 @@ Bool XCheckIfEvent ( + /* another thread has snatched this event */ + prev = NULL; + } ++ dpy->in_ifevent = False; + UnlockDisplay(dpy); + return False; + } +diff --git a/src/IfEvent.c b/src/IfEvent.c +index ead93dca..a0aed7e3 100644 +--- a/src/IfEvent.c ++++ b/src/IfEvent.c +@@ -49,6 +49,7 @@ XIfEvent ( + unsigned long qe_serial = 0; + + LockDisplay(dpy); ++ dpy->in_ifevent = True; + prev = NULL; + while (1) { + for (qelt = prev ? prev->next : dpy->head; +@@ -59,6 +60,7 @@ XIfEvent ( + *event = qelt->event; + _XDeq(dpy, prev, qelt); + _XStoreEventCookie(dpy, event); ++ dpy->in_ifevent = False; + UnlockDisplay(dpy); + return 0; + } +diff --git a/src/OpenDis.c b/src/OpenDis.c +index 5017b040..e1bc2a30 100644 +--- a/src/OpenDis.c ++++ b/src/OpenDis.c +@@ -189,6 +189,7 @@ XOpenDisplay ( + dpy->xcmisc_opcode = 0; + dpy->xkb_info = NULL; + dpy->exit_handler_data = NULL; ++ dpy->in_ifevent = False; + + /* + * Setup other information in this display structure. +diff --git a/src/PeekIfEv.c b/src/PeekIfEv.c +index 207cd119..c4e8af0d 100644 +--- a/src/PeekIfEv.c ++++ b/src/PeekIfEv.c +@@ -50,6 +50,7 @@ XPeekIfEvent ( + unsigned long qe_serial = 0; + + LockDisplay(dpy); ++ dpy->in_ifevent = True; + prev = NULL; + while (1) { + for (qelt = prev ? prev->next : dpy->head; +@@ -63,6 +64,7 @@ XPeekIfEvent ( + _XStoreEventCookie(dpy, ©); + *event = copy; + } ++ dpy->in_ifevent = False; + UnlockDisplay(dpy); + return 0; + } +diff --git a/src/locking.c b/src/locking.c +index ea5000e1..36530691 100644 +--- a/src/locking.c ++++ b/src/locking.c +@@ -452,6 +452,32 @@ static void _XDisplayLockWait( + } + } + ++static void _XLockDisplay( ++ Display *dpy ++ XTHREADS_FILE_LINE_ARGS ++ ); ++ ++static void _XIfEventLockDisplay( ++ Display *dpy ++ XTHREADS_FILE_LINE_ARGS ++ ) ++{ ++ /* assert(dpy->in_ifevent); */ ++} ++ ++static void _XIfEventUnlockDisplay( ++ Display *dpy ++ XTHREADS_FILE_LINE_ARGS ++ ) ++{ ++ if (dpy->in_ifevent) ++ return; ++ ++ dpy->lock_fns->lock_display = _XLockDisplay; ++ dpy->lock_fns->unlock_display = _XUnlockDisplay; ++ UnlockDisplay(dpy); ++} ++ + static void _XLockDisplay( + Display *dpy + XTHREADS_FILE_LINE_ARGS +@@ -478,6 +504,10 @@ static void _XLockDisplay( + #endif + _XIDHandler(dpy); + _XSeqSyncFunction(dpy); ++ if (dpy->in_ifevent) { ++ dpy->lock_fns->lock_display = _XIfEventLockDisplay; ++ dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay; ++ } + } + + /* +-- +GitLab + diff --git a/x11-libs/libX11/libX11-1.8.1-r10.ebuild b/x11-libs/libX11/libX11-1.8.1-r10.ebuild new file mode 100644 index 00000000..7e1cbddf --- /dev/null +++ b/x11-libs/libX11/libX11-1.8.1-r10.ebuild @@ -0,0 +1,46 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +XORG_DOC=doc +XORG_MULTILIB=yes +XORG_TARBALL_SUFFIX=xz +inherit toolchain-funcs xorg-3 + +# Note: please bump this with x11-misc/compose-tables +DESCRIPTION="X.Org X11 library" + +KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~loong ~m68k ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos" +IUSE="test" +RESTRICT="!test? ( test )" + +RDEPEND=" + >=x11-libs/libxcb-1.11.1[${MULTILIB_USEDEP}] + x11-misc/compose-tables + + !<xfce-base/xfce4-settings-4.16.3 +" +DEPEND="${RDEPEND} + x11-base/xorg-proto + x11-libs/xtrans +" +BDEPEND="test? ( dev-lang/perl )" + +PATCHES=( "${FILESDIR}"/150.patch ) + +src_configure() { + local XORG_CONFIGURE_OPTIONS=( + $(use_with doc xmlto) + $(use_enable doc specs) + --enable-ipv6 + --without-fop + CPP="$(tc-getPROG CPP cpp)" + ) + xorg-3_src_configure +} + +src_install() { + xorg-3_src_install + rm -rf "${ED}"/usr/share/X11/locale || die +} |