diff options
-rw-r--r-- | x11-libs/libX11/files/libX11-1.8.2-reentrancy.patch | 149 | ||||
-rw-r--r-- | x11-libs/libX11/libX11-1.8.2-r1.ebuild | 48 |
2 files changed, 197 insertions, 0 deletions
diff --git a/x11-libs/libX11/files/libX11-1.8.2-reentrancy.patch b/x11-libs/libX11/files/libX11-1.8.2-reentrancy.patch new file mode 100644 index 000000000000..784adaeb008f --- /dev/null +++ b/x11-libs/libX11/files/libX11-1.8.2-reentrancy.patch @@ -0,0 +1,149 @@ +https://gitlab.freedesktop.org/xorg/lib/libx11/-/commit/a9e845809bcaae22496bc8aa3ca252b410d5f39b +https://bugs.gentoo.org/862115 + +From a9e845809bcaae22496bc8aa3ca252b410d5f39b Mon Sep 17 00:00:00 2001 +From: Matthieu Herrb <matthieu@herrb.eu> +Date: Fri, 11 Nov 2022 18:55:23 +0100 +Subject: [PATCH] Fix 797755 Allow X*IfEvent() to reenter libX11 + +- the activation logic is reversed +- there is also _XInternalLockDisplay() that needs protection +- I've found cases (in fvwm2) where the callback calls XCheckIfEvent() + recursively. So the flag needs to be a counter. + +Reviewed-by: Adam Jackson <ajax@redhat.com> +--- a/include/X11/Xlibint.h ++++ b/include/X11/Xlibint.h +@@ -207,7 +207,7 @@ struct _XDisplay + + XIOErrorExitHandler exit_handler; + void *exit_handler_data; +- Bool in_ifevent; ++ CARD32 in_ifevent; + }; + + #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) +--- a/src/ChkIfEv.c ++++ b/src/ChkIfEv.c +@@ -49,8 +49,8 @@ Bool XCheckIfEvent ( + unsigned long qe_serial = 0; + int n; /* time through count */ + ++ dpy->in_ifevent++; + LockDisplay(dpy); +- dpy->in_ifevent = True; + prev = NULL; + for (n = 3; --n >= 0;) { + for (qelt = prev ? prev->next : dpy->head; +@@ -80,7 +80,7 @@ Bool XCheckIfEvent ( + /* another thread has snatched this event */ + prev = NULL; + } +- dpy->in_ifevent = False; ++ dpy->in_ifevent--; + UnlockDisplay(dpy); + return False; + } +--- a/src/IfEvent.c ++++ b/src/IfEvent.c +@@ -48,8 +48,8 @@ XIfEvent ( + register _XQEvent *qelt, *prev; + unsigned long qe_serial = 0; + ++ dpy->in_ifevent++; + LockDisplay(dpy); +- dpy->in_ifevent = True; + prev = NULL; + while (1) { + for (qelt = prev ? prev->next : dpy->head; +@@ -60,7 +60,7 @@ XIfEvent ( + *event = qelt->event; + _XDeq(dpy, prev, qelt); + _XStoreEventCookie(dpy, event); +- dpy->in_ifevent = False; ++ dpy->in_ifevent--; + UnlockDisplay(dpy); + return 0; + } +--- a/src/OpenDis.c ++++ b/src/OpenDis.c +@@ -189,7 +189,7 @@ XOpenDisplay ( + dpy->xcmisc_opcode = 0; + dpy->xkb_info = NULL; + dpy->exit_handler_data = NULL; +- dpy->in_ifevent = False; ++ dpy->in_ifevent = 0; + + /* + * Setup other information in this display structure. +--- a/src/PeekIfEv.c ++++ b/src/PeekIfEv.c +@@ -49,8 +49,8 @@ XPeekIfEvent ( + register _XQEvent *prev, *qelt; + unsigned long qe_serial = 0; + ++ dpy->in_ifevent++; + LockDisplay(dpy); +- dpy->in_ifevent = True; + prev = NULL; + while (1) { + for (qelt = prev ? prev->next : dpy->head; +@@ -64,7 +64,7 @@ XPeekIfEvent ( + _XStoreEventCookie(dpy, ©); + *event = copy; + } +- dpy->in_ifevent = False; ++ dpy->in_ifevent--; + UnlockDisplay(dpy); + return 0; + } +--- a/src/locking.c ++++ b/src/locking.c +@@ -465,17 +465,33 @@ static void _XIfEventLockDisplay( + /* assert(dpy->in_ifevent); */ + } + ++static void _XInternalLockDisplay( ++ Display *dpy, ++ Bool wskip ++ XTHREADS_FILE_LINE_ARGS ++ ); ++ ++static void _XIfEventInternalLockDisplay( ++ Display *dpy, ++ Bool wskip ++ XTHREADS_FILE_LINE_ARGS ++ ) ++{ ++ /* assert(dpy->in_ifevent); */ ++} ++ + static void _XIfEventUnlockDisplay( + Display *dpy + XTHREADS_FILE_LINE_ARGS + ) + { +- if (dpy->in_ifevent) ++ if (dpy->in_ifevent == 0) { ++ dpy->lock_fns->lock_display = _XLockDisplay; ++ dpy->lock_fns->unlock_display = _XUnlockDisplay; ++ dpy->lock->internal_lock_display = _XInternalLockDisplay; ++ UnlockDisplay(dpy); ++ } else + return; +- +- dpy->lock_fns->lock_display = _XLockDisplay; +- dpy->lock_fns->unlock_display = _XUnlockDisplay; +- UnlockDisplay(dpy); + } + + static void _XLockDisplay( +@@ -507,6 +523,7 @@ static void _XLockDisplay( + if (dpy->in_ifevent) { + dpy->lock_fns->lock_display = _XIfEventLockDisplay; + dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay; ++ dpy->lock->internal_lock_display = _XIfEventInternalLockDisplay; + } + } + +GitLab diff --git a/x11-libs/libX11/libX11-1.8.2-r1.ebuild b/x11-libs/libX11/libX11-1.8.2-r1.ebuild new file mode 100644 index 000000000000..b848ddf9b842 --- /dev/null +++ b/x11-libs/libX11/libX11-1.8.2-r1.ebuild @@ -0,0 +1,48 @@ +# 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}"/${P}-reentrancy.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 +} |