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:
Dominique Leuenberger 2022-12-06 13:22:47 +00:00 committed by Git OBS Bridge
commit 05a1f83507
10 changed files with 91 additions and 517 deletions

View File

@ -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

View File

@ -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

View File

@ -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, &copy);
*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

View File

@ -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, &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

@ -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

View 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
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1bc41aa1bbe01401f330d76dfa19f386b79c51881c7bbfee9eb4e27f22f2d9f7
size 1818460

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ed91d573d570db83b8ae546f4890dccfcd0b9dfe1e50a1b401b63a74c152ed04
size 1823712

View File

@ -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>

View File

@ -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 \