- U_0001-Add-XFreeThreads-function.patch

U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch
  U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
  U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch
  U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch
  * adding all patches since 1.8.2 release in order to try fixing
    regressions after introducing thread safety constructor with
    1.8.1 (boo#1205778, boo#1205818)
- supersedes U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
- re-enabled thread safe constructor

OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/libX11?expand=0&rev=91
This commit is contained in:
Stefan Dirsch 2022-12-03 10:31:33 +00:00 committed by Git OBS Bridge
parent a6dfe3614d
commit e17a686d68
7 changed files with 359 additions and 4 deletions

View File

@ -0,0 +1,108 @@
From 696d19d5db7bcb1c1f582c2b1846520e7e0870cb Mon Sep 17 00:00:00 2001
From: Oliver <halting@riseup.net>
Date: Fri, 11 Nov 2022 17:04:00 +0000
Subject: [PATCH 1/5] Add XFreeThreads function.
---
include/X11/Xlib.h | 4 ++++
man/XInitThreads.man | 8 +++++++-
src/globals.c | 6 ++++++
src/locking.c | 23 +++++++++++++++++++++++
4 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/include/X11/Xlib.h b/include/X11/Xlib.h
index f62fb470..29ea5715 100644
--- a/include/X11/Xlib.h
+++ b/include/X11/Xlib.h
@@ -1735,6 +1735,10 @@ extern Status XInitThreads(
void
);
+extern Status XFreeThreads(
+ void
+);
+
extern void XLockDisplay(
Display* /* display */
);
diff --git a/man/XInitThreads.man b/man/XInitThreads.man
index 4ae95228..b629bd28 100644
--- a/man/XInitThreads.man
+++ b/man/XInitThreads.man
@@ -52,6 +52,8 @@ XInitThreads, XLockDisplay, XUnlockDisplay \- multi-threading support
.HP
Status XInitThreads\^(void);
.HP
+Status XFreeThreads\^(void);
+.HP
void XLockDisplay\^(\^Display *\fIdisplay\fP\^);
.HP
void XUnlockDisplay\^(\^Display *\fIdisplay\fP\^);
@@ -76,7 +78,11 @@ are protected by some other access mechanism (for example,
a mutual exclusion lock in a toolkit or through explicit client
programming), Xlib thread initialization is not required.
It is recommended that single-threaded programs not call this function.
-
+.LP
+The
+.B XFreeThreads
+function frees the memory allocated by
+.BR XInitThreads .
.LP
The
.B XLockDisplay
diff --git a/src/globals.c b/src/globals.c
index 66b589fe..c07de431 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -105,4 +105,10 @@ xlib_ctor(void)
{
XInitThreads();
}
+
+__attribute__((destructor)) static void
+xlib_dtor(void)
+{
+ XFreeThreads();
+}
#endif
diff --git a/src/locking.c b/src/locking.c
index 36530691..bdc07011 100644
--- a/src/locking.c
+++ b/src/locking.c
@@ -673,9 +673,32 @@ Status XInitThreads(void)
return 1;
}
+Status XFreeThreads(void)
+{
+ if (global_lock.lock != NULL) {
+ xmutex_free(global_lock.lock);
+ global_lock.lock = NULL;
+ }
+ if (i18n_lock.lock != NULL) {
+ xmutex_free(i18n_lock.lock);
+ i18n_lock.lock = NULL;
+ }
+ if (conv_lock.lock != NULL) {
+ xmutex_free(conv_lock.lock);
+ conv_lock.lock = NULL;
+ }
+
+ return 1;
+}
+
#else /* XTHREADS */
Status XInitThreads(void)
{
return 0;
}
+
+Status XFreeThreads(void)
+{
+ return 0;
+}
#endif /* XTHREADS */
--
2.35.3

View File

@ -0,0 +1,60 @@
From bccd787a565d3a88673bfc06574c1939f98d8d72 Mon Sep 17 00:00:00 2001
From: Nia Alarie <nia@NetBSD.org>
Date: Thu, 10 Nov 2022 22:31:47 +0100
Subject: [PATCH 2/5] Don't use pragma inside a function, it breaks compiling
with older GCCs.
XKBBind.c:230: error: #pragma GCC diagnostic not allowed inside functions
Signed-off-by: Thomas Klausner <wiz@gatalith.at>
---
src/xkb/XKBBind.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c
index a63c86ea..467e4198 100644
--- a/src/xkb/XKBBind.c
+++ b/src/xkb/XKBBind.c
@@ -202,6 +202,14 @@ XkbKeysymToModifiers(Display *dpy, KeySym ks)
return mods;
}
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
KeySym
XLookupKeysym(register XKeyEvent * event, int col)
{
@@ -211,22 +219,15 @@ XLookupKeysym(register XKeyEvent * event, int col)
return _XLookupKeysym(event, col);
_XkbCheckPendingRefresh(dpy, dpy->xkb_info);
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#elif defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
return XKeycodeToKeysym(dpy, event->keycode, col);
+}
+
#ifdef __clang__
#pragma clang diagnostic pop
#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
-}
-
/*
* Not a public entry point -- XkbTranslateKey is an obsolete name
* that is preserved here so that functions linked against the old
--
2.35.3

View File

@ -1,7 +1,7 @@
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
Subject: [PATCH 3/5] Fix 797755 Allow X*IfEvent() to reenter libX11
- the activation logic is reversed
- there is also _XInternalLockDisplay() that needs protection

View File

@ -0,0 +1,138 @@
From 70eaf1174e2809d1a6c43868d53f8cd844ef636a Mon Sep 17 00:00:00 2001
From: Ulrich Sibiller <uli42@gmx.de>
Date: Wed, 30 Nov 2022 23:42:02 +0100
Subject: [PATCH 4/5] Indentation fixes around recent dpy->in_ifevent changes
Use the same indentation as the surrounding code.
Signed-off-by: Ulrich Sibiller <uli42@gmx.de>
Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
---
src/ChkIfEv.c | 6 +++---
src/IfEvent.c | 6 +++---
src/OpenDis.c | 2 +-
src/PeekIfEv.c | 4 ++--
src/locking.c | 16 ++++++++--------
5 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c
index 1bbcba5b..eba36941 100644
--- 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++;
+ LockDisplay(dpy);
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--;
+ dpy->in_ifevent--;
UnlockDisplay(dpy);
return False;
}
diff --git a/src/IfEvent.c b/src/IfEvent.c
index 593e7acf..54c37f00 100644
--- 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++;
+ LockDisplay(dpy);
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--;
+ dpy->in_ifevent--;
UnlockDisplay(dpy);
return 0;
}
diff --git a/src/OpenDis.c b/src/OpenDis.c
index 17dc4cb2..7c8d4e1a 100644
--- 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 = 0;
+ dpy->in_ifevent = 0;
/*
* Setup other information in this display structure.
diff --git a/src/PeekIfEv.c b/src/PeekIfEv.c
index 7e09c00b..68c028b7 100644
--- a/src/PeekIfEv.c
+++ b/src/PeekIfEv.c
@@ -49,7 +49,7 @@ XPeekIfEvent (
register _XQEvent *prev, *qelt;
unsigned long qe_serial = 0;
- dpy->in_ifevent++;
+ dpy->in_ifevent++;
LockDisplay(dpy);
prev = NULL;
while (1) {
@@ -64,7 +64,7 @@ XPeekIfEvent (
_XStoreEventCookie(dpy, &copy);
*event = copy;
}
- dpy->in_ifevent--;
+ dpy->in_ifevent--;
UnlockDisplay(dpy);
return 0;
}
diff --git a/src/locking.c b/src/locking.c
index 690b2bf6..c550603e 100644
--- a/src/locking.c
+++ b/src/locking.c
@@ -486,12 +486,12 @@ static void _XIfEventUnlockDisplay(
)
{
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);
+ dpy->lock_fns->lock_display = _XLockDisplay;
+ dpy->lock_fns->unlock_display = _XUnlockDisplay;
+ dpy->lock->internal_lock_display = _XInternalLockDisplay;
+ UnlockDisplay(dpy);
} else
- return;
+ return;
}
static void _XLockDisplay(
@@ -521,9 +521,9 @@ static void _XLockDisplay(
_XIDHandler(dpy);
_XSeqSyncFunction(dpy);
if (dpy->in_ifevent) {
- dpy->lock_fns->lock_display = _XIfEventLockDisplay;
- dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay;
- dpy->lock->internal_lock_display = _XIfEventInternalLockDisplay;
+ dpy->lock_fns->lock_display = _XIfEventLockDisplay;
+ dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay;
+ dpy->lock->internal_lock_display = _XIfEventInternalLockDisplay;
}
}
--
2.35.3

View File

@ -0,0 +1,28 @@
From ba095967349dff583bd0989d0ba78aa334e9bedf Mon Sep 17 00:00:00 2001
From: Ulrich Sibiller <uli42@gmx.de>
Date: Wed, 30 Nov 2022 23:47:29 +0100
Subject: [PATCH 5/5] ChkIfEv.c: fix wrong handling of dpy->in_ifevent
Is no longer a bool but a counter.
Signed-off-by: Ulrich Sibiller <uli42@gmx.de>
---
src/ChkIfEv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c
index eba36941..b32c2d3e 100644
--- a/src/ChkIfEv.c
+++ b/src/ChkIfEv.c
@@ -61,7 +61,7 @@ Bool XCheckIfEvent (
*event = qelt->event;
_XDeq(dpy, prev, qelt);
_XStoreEventCookie(dpy, event);
- dpy->in_ifevent = False;
+ dpy->in_ifevent--;
UnlockDisplay(dpy);
return True;
}
--
2.35.3

View File

@ -1,3 +1,17 @@
-------------------------------------------------------------------
Sat Dec 3 10:20:09 UTC 2022 - Stefan Dirsch <sndirsch@suse.com>
- U_0001-Add-XFreeThreads-function.patch
U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch
U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch
U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch
* adding all patches since 1.8.2 release in order to try fixing
regressions after introducing thread safety constructor with
1.8.1 (boo#1205778, boo#1205818)
- supersedes U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
- re-enabled thread safe constructor
-------------------------------------------------------------------
Fri Dec 2 14:17:32 UTC 2022 - Stefan Dirsch <sndirsch@suse.com>

View File

@ -32,7 +32,11 @@ Patch1: p_xlib_skip_ext_env.diff
# PATCH-FIX-UPSTREAM en-locales.diff fdo#48596 bnc#388711 -- Add missing data for more en locales
Patch2: en-locales.diff
Patch3: u_no-longer-crash-in-XVisualIDFromVisual.patch
Patch4: U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
Patch11: U_0001-Add-XFreeThreads-function.patch
Patch12: U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch
Patch13: U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch
Patch14: U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch
Patch15: U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch
BuildRequires: fdupes
BuildRequires: libtool
BuildRequires: pkgconfig
@ -136,13 +140,16 @@ test -f nls/ja.S90/XLC_LOCALE.pre && exit 1
%patch1
%patch2
%patch3 -p1
%patch4 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%build
%configure \
--disable-silent-rules \
--docdir=%{_docdir}/%{name} \
--disable-thread-safety-constructor \
--disable-static
make %{?_smp_mflags}