Hi,

I've been preparing various X libraries updates during r2k22. Among
them is an update to libX11 1.8.1, which add an unconditional
XInitThreads() call during libX11 initialisation.

This is causing a (known) regression in xfce4-settings, causing
xfsettingsd to abort.

This adds a patch to fix the issue.

https://gitlab.xfce.org/xfce/xfce4-settings/-/issues/369

PS: xfsettingd is multi-threaded, and I've no way to be sure that only
one thread will do X calls. So it should have been using XInitThreads
from the start.


diff --git a/x11/xfce4/xfce4-settings/Makefile 
b/x11/xfce4/xfce4-settings/Makefile
index 19532c9036f..28a71cb0eb4 100644
--- a/x11/xfce4/xfce4-settings/Makefile
+++ b/x11/xfce4/xfce4-settings/Makefile
@@ -2,7 +2,7 @@ COMMENT=        Xfce4 settings helpers
 
 XFCE_PROJECT=  xfce4-settings
 XFCE_VERSION=  4.16.2
-REVISION=      2
+REVISION=      3
 
 # GPLv2
 PERMIT_PACKAGE=        Yes
diff --git a/x11/xfce4/xfce4-settings/patches/patch-xfsettingsd_xsettings_c 
b/x11/xfce4/xfce4-settings/patches/patch-xfsettingsd_xsettings_c
new file mode 100644
index 00000000000..7a47a5aaf56
--- /dev/null
+++ b/x11/xfce4/xfce4-settings/patches/patch-xfsettingsd_xsettings_c
@@ -0,0 +1,57 @@
+Fix recursive lock in libX11
+
+Index: xfsettingsd/xsettings.c
+--- xfsettingsd/xsettings.c.orig
++++ xfsettingsd/xsettings.c
+@@ -144,6 +144,12 @@ struct _XfceXSettingsScreen
+     gint     screen_num;
+ };
+ 
++struct _XfceTimestamp
++{
++    Window window;
++    Atom   atom;
++};
++  
+ 
+ 
+ G_DEFINE_TYPE (XfceXSettingsHelper, xfce_xsettings_helper, G_TYPE_OBJECT);
+@@ -1033,11 +1039,11 @@ xfce_xsettings_helper_timestamp_predicate (Display  *x
+                                            XEvent   *xevent,
+                                            XPointer  arg)
+ {
+-    Window window = GPOINTER_TO_UINT (arg);
++    struct _XfceTimestamp *ts = (struct _XfceTimestamp *)arg;
+ 
+     return (xevent->type == PropertyNotify
+-            && xevent->xproperty.window == window
+-            && xevent->xproperty.atom == XInternAtom (xdisplay, 
"_TIMESTAMP_PROP", False));
++            && xevent->xproperty.window == ts->window
++            && xevent->xproperty.atom == ts->atom);
+ }
+ 
+ 
+@@ -1046,17 +1052,18 @@ Time
+ xfce_xsettings_get_server_time (Display *xdisplay,
+                                 Window   window)
+ {
+-    Atom   timestamp_atom;
++    struct _XfceTimestamp *ts = g_malloc(sizeof(struct _XfceTimestamp));
+     guchar c = 'a';
+     XEvent xevent;
+ 
+     /* get the current xserver timestamp */
+-    timestamp_atom = XInternAtom (xdisplay, "_TIMESTAMP_PROP", False);
+-    XChangeProperty (xdisplay, window, timestamp_atom, timestamp_atom,
++    ts->atom = XInternAtom (xdisplay, "_TIMESTAMP_PROP", False);
++    ts->window = window;
++    XChangeProperty (xdisplay, window, ts->atom, ts->atom,
+                      8, PropModeReplace, &c, 1);
+     XIfEvent (xdisplay, &xevent, xfce_xsettings_helper_timestamp_predicate,
+-              GUINT_TO_POINTER (window));
+-
++              (XPointer)ts);
++    g_free(ts);
+     return xevent.xproperty.time;
+ }
+ 
-- 
2.36.1


-- 
Matthieu Herrb

Reply via email to