From e17a686d680bdf5c7f93afd11605cb4f93db14c198e31b920b94d35e66fd499a Mon Sep 17 00:00:00 2001 From: Stefan Dirsch Date: Sat, 3 Dec 2022 10:31:33 +0000 Subject: [PATCH] - 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 --- U_0001-Add-XFreeThreads-function.patch | 108 ++++++++++++++ ...-inside-a-function-it-breaks-compili.patch | 60 ++++++++ ...55-Allow-X-IfEvent-to-reenter-libX11.patch | 2 +- ...s-around-recent-dpy-in_ifevent-chang.patch | 138 ++++++++++++++++++ ...fix-wrong-handling-of-dpy-in_ifevent.patch | 28 ++++ libX11.changes | 14 ++ libX11.spec | 13 +- 7 files changed, 359 insertions(+), 4 deletions(-) create mode 100644 U_0001-Add-XFreeThreads-function.patch create mode 100644 U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch rename U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch => U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch (98%) create mode 100644 U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch create mode 100644 U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch diff --git a/U_0001-Add-XFreeThreads-function.patch b/U_0001-Add-XFreeThreads-function.patch new file mode 100644 index 0000000..b5768ad --- /dev/null +++ b/U_0001-Add-XFreeThreads-function.patch @@ -0,0 +1,108 @@ +From 696d19d5db7bcb1c1f582c2b1846520e7e0870cb Mon Sep 17 00:00:00 2001 +From: Oliver +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 + diff --git a/U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch b/U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch new file mode 100644 index 0000000..c95813f --- /dev/null +++ b/U_0002-Don-t-use-pragma-inside-a-function-it-breaks-compili.patch @@ -0,0 +1,60 @@ +From bccd787a565d3a88673bfc06574c1939f98d8d72 Mon Sep 17 00:00:00 2001 +From: Nia Alarie +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 +--- + 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 + diff --git a/U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch b/U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch similarity index 98% rename from U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch rename to U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch index d9df3ea..b95b52a 100644 --- a/U_Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch +++ b/U_0003-Fix-797755-Allow-X-IfEvent-to-reenter-libX11.patch @@ -1,7 +1,7 @@ From a9e845809bcaae22496bc8aa3ca252b410d5f39b Mon Sep 17 00:00:00 2001 From: Matthieu Herrb 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 diff --git a/U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch b/U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch new file mode 100644 index 0000000..f2e850a --- /dev/null +++ b/U_0004-Indentation-fixes-around-recent-dpy-in_ifevent-chang.patch @@ -0,0 +1,138 @@ +From 70eaf1174e2809d1a6c43868d53f8cd844ef636a Mon Sep 17 00:00:00 2001 +From: Ulrich Sibiller +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 +Reviewed-by: Alan Coopersmith +--- + 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, ©); + *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 + diff --git a/U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch b/U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch new file mode 100644 index 0000000..9f58156 --- /dev/null +++ b/U_0005-ChkIfEv.c-fix-wrong-handling-of-dpy-in_ifevent.patch @@ -0,0 +1,28 @@ +From ba095967349dff583bd0989d0ba78aa334e9bedf Mon Sep 17 00:00:00 2001 +From: Ulrich Sibiller +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 +--- + 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 + diff --git a/libX11.changes b/libX11.changes index f5c04ae..97ebb0a 100644 --- a/libX11.changes +++ b/libX11.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Sat Dec 3 10:20:09 UTC 2022 - Stefan Dirsch + +- 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 diff --git a/libX11.spec b/libX11.spec index ca34014..1dc53c9 100644 --- a/libX11.spec +++ b/libX11.spec @@ -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}