commit:     eeb3b760c6031ad77d1deeceef1d5cca3714a6d4
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 25 06:04:05 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Nov 25 06:04:05 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=eeb3b760

x11-libs/libX11: backport another reentrancy fix

Closes: https://bugs.gentoo.org/862115
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../libX11/files/libX11-1.8.2-reentrancy.patch     | 149 +++++++++++++++++++++
 x11-libs/libX11/libX11-1.8.2-r1.ebuild             |  48 +++++++
 2 files changed, 197 insertions(+)

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 <matth...@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 <a...@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, &copy);
+                       *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
+}

Reply via email to