Accepting request 1040432 from X11:XOrg
- Update to version 1.8.1 This release fixes the --enable-thread-safety-constructor option to the configure script to work as intended. In the previous release, the changes for this option may not have been enabled when the option was not specified or when the --enable option was specified. While we have enabled it by default, believing that doing so will reduce the number of bugs users encounter running libX11 clients, in some cases it may expose bugs in which clients had previously gotten away with calling libX11 functions while a libX11 lock is already held, and thus now deadlock, as discussed in https://gitlab.freedesktop.org/xorg/lib/libx11/-/issues/157 - let's hope this version doesn't suffer yet from the regressions reported in boo#1205778, boo#1205818 (reported against 1.8.2); we need libX11 thread safe for totem (GNOME 43) :-( - going back to version 1.7.5 for now to get rid of regressions, which were introduced by trying to get thread-safe in libX11 itself - re-introduced U_fix-a-memory-leak-in-XRegisterIMInstantiateCallback.patch which was not yet in 1.7.5 - supersedes the following patches * 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 OBS-URL: https://build.opensuse.org/request/show/1040432 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libX11?expand=0&rev=45
This commit is contained in:
commit
05a1f83507
@ -1,108 +0,0 @@
|
||||
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
|
||||
|
@ -1,60 +0,0 @@
|
||||
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
|
||||
|
@ -1,169 +0,0 @@
|
||||
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 3/5] 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>
|
||||
---
|
||||
include/X11/Xlibint.h | 2 +-
|
||||
src/ChkIfEv.c | 4 ++--
|
||||
src/IfEvent.c | 4 ++--
|
||||
src/OpenDis.c | 2 +-
|
||||
src/PeekIfEv.c | 4 ++--
|
||||
src/locking.c | 27 ++++++++++++++++++++++-----
|
||||
6 files changed, 30 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h
|
||||
index b4275ebd..e20c4833 100644
|
||||
--- 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)
|
||||
diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c
|
||||
index 327b5eaf..1bbcba5b 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 = 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;
|
||||
}
|
||||
diff --git a/src/IfEvent.c b/src/IfEvent.c
|
||||
index a0aed7e3..593e7acf 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 = 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;
|
||||
}
|
||||
diff --git a/src/OpenDis.c b/src/OpenDis.c
|
||||
index e1bc2a30..17dc4cb2 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 = False;
|
||||
+ dpy->in_ifevent = 0;
|
||||
|
||||
/*
|
||||
* Setup other information in this display structure.
|
||||
diff --git a/src/PeekIfEv.c b/src/PeekIfEv.c
|
||||
index c4e8af0d..7e09c00b 100644
|
||||
--- 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;
|
||||
}
|
||||
diff --git a/src/locking.c b/src/locking.c
|
||||
index bdc07011..690b2bf6 100644
|
||||
--- 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;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,138 +0,0 @@
|
||||
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, ©);
|
||||
*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
|
||||
|
@ -1,28 +0,0 @@
|
||||
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
|
||||
|
53
U_fix-a-memory-leak-in-XRegisterIMInstantiateCallback.patch
Normal file
53
U_fix-a-memory-leak-in-XRegisterIMInstantiateCallback.patch
Normal file
@ -0,0 +1,53 @@
|
||||
From 1d11822601fd24a396b354fa616b04ed3df8b4ef Mon Sep 17 00:00:00 2001
|
||||
From: "Thomas E. Dickey" <dickey@invisible-island.net>
|
||||
Date: Tue, 4 Oct 2022 18:26:17 -0400
|
||||
Subject: [PATCH] fix a memory leak in XRegisterIMInstantiateCallback
|
||||
|
||||
Analysis:
|
||||
|
||||
_XimRegisterIMInstantiateCallback() opens an XIM and closes it using
|
||||
the internal function pointers, but the internal close function does
|
||||
not free the pointer to the XIM (this would be done in XCloseIM()).
|
||||
|
||||
Report/patch:
|
||||
|
||||
Date: Mon, 03 Oct 2022 18:47:32 +0800
|
||||
From: Po Lu <luangruo@yahoo.com>
|
||||
To: xorg-devel@lists.x.org
|
||||
Subject: Re: Yet another leak in Xlib
|
||||
|
||||
For reference, here's how I'm calling XRegisterIMInstantiateCallback:
|
||||
|
||||
XSetLocaleModifiers ("");
|
||||
XRegisterIMInstantiateCallback (compositor.display,
|
||||
XrmGetDatabase (compositor.display),
|
||||
(char *) compositor.resource_name,
|
||||
(char *) compositor.app_name,
|
||||
IMInstantiateCallback, NULL);
|
||||
|
||||
and XMODIFIERS is:
|
||||
|
||||
@im=ibus
|
||||
|
||||
Signed-off-by: Thomas E. Dickey <dickey@invisible-island.net>
|
||||
---
|
||||
modules/im/ximcp/imInsClbk.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/modules/im/ximcp/imInsClbk.c b/modules/im/ximcp/imInsClbk.c
|
||||
index 95b379cb..c10e347f 100644
|
||||
--- a/modules/im/ximcp/imInsClbk.c
|
||||
+++ b/modules/im/ximcp/imInsClbk.c
|
||||
@@ -212,6 +212,9 @@ _XimRegisterIMInstantiateCallback(
|
||||
if( xim ) {
|
||||
lock = True;
|
||||
xim->methods->close( (XIM)xim );
|
||||
+ /* XIMs must be freed manually after being opened; close just
|
||||
+ does the protocol to deinitialize the IM. */
|
||||
+ XFree( xim );
|
||||
lock = False;
|
||||
icb->call = True;
|
||||
callback( display, client_data, NULL );
|
||||
--
|
||||
2.35.3
|
||||
|
3
libX11-1.8.1.tar.xz
Normal file
3
libX11-1.8.1.tar.xz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1bc41aa1bbe01401f330d76dfa19f386b79c51881c7bbfee9eb4e27f22f2d9f7
|
||||
size 1818460
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ed91d573d570db83b8ae546f4890dccfcd0b9dfe1e50a1b401b63a74c152ed04
|
||||
size 1823712
|
@ -1,3 +1,35 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Dec 5 20:33:29 UTC 2022 - Stefan Dirsch <sndirsch@suse.com>
|
||||
|
||||
- Update to version 1.8.1
|
||||
This release fixes the --enable-thread-safety-constructor option to the
|
||||
configure script to work as intended. In the previous release, the changes
|
||||
for this option may not have been enabled when the option was not specified
|
||||
or when the --enable option was specified.
|
||||
While we have enabled it by default, believing that doing so will reduce
|
||||
the number of bugs users encounter running libX11 clients, in some cases
|
||||
it may expose bugs in which clients had previously gotten away with calling
|
||||
libX11 functions while a libX11 lock is already held, and thus now deadlock,
|
||||
as discussed in https://gitlab.freedesktop.org/xorg/lib/libx11/-/issues/157
|
||||
- let's hope this version doesn't suffer yet from the regressions
|
||||
reported in boo#1205778, boo#1205818 (reported against 1.8.2);
|
||||
we need libX11 thread safe for totem (GNOME 43) :-(
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Dec 5 13:40:36 UTC 2022 - Stefan Dirsch <sndirsch@suse.com>
|
||||
|
||||
- going back to version 1.7.5 for now to get rid of regressions,
|
||||
which were introduced by trying to get thread-safe in libX11
|
||||
itself
|
||||
- re-introduced U_fix-a-memory-leak-in-XRegisterIMInstantiateCallback.patch
|
||||
which was not yet in 1.7.5
|
||||
- supersedes the following patches
|
||||
* 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
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Dec 3 10:20:09 UTC 2022 - Stefan Dirsch <sndirsch@suse.com>
|
||||
|
||||
|
14
libX11.spec
14
libX11.spec
@ -17,7 +17,7 @@
|
||||
|
||||
|
||||
Name: libX11
|
||||
Version: 1.8.2
|
||||
Version: 1.8.1
|
||||
Release: 0
|
||||
Summary: Core X11 protocol client library
|
||||
License: MIT
|
||||
@ -32,11 +32,7 @@ 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
|
||||
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
|
||||
Patch4: U_fix-a-memory-leak-in-XRegisterIMInstantiateCallback.patch
|
||||
BuildRequires: fdupes
|
||||
BuildRequires: libtool
|
||||
BuildRequires: pkgconfig
|
||||
@ -140,11 +136,7 @@ test -f nls/ja.S90/XLC_LOCALE.pre && exit 1
|
||||
%patch1
|
||||
%patch2
|
||||
%patch3 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
%patch13 -p1
|
||||
%patch14 -p1
|
||||
%patch15 -p1
|
||||
%patch4 -p1
|
||||
|
||||
%build
|
||||
%configure \
|
||||
|
Loading…
Reference in New Issue
Block a user