1 |
commit: 804a1b3955488d8b00768d15a2748a97ca615eb6 |
2 |
Author: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Oct 4 11:56:38 2020 +0000 |
4 |
Commit: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Oct 4 15:54:08 2020 +0000 |
6 |
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=804a1b39 |
7 |
|
8 |
kde-plasma/kwin: Make removal of X11 event filters safe |
9 |
|
10 |
KDE-Bug: https://bugs.kde.org/show_bug.cgi?id=423319 |
11 |
Package-Manager: Portage-3.0.8, Repoman-3.0.1 |
12 |
Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org> |
13 |
|
14 |
...-5.19.5-safe-removal-of-X11-event-filters.patch | 162 +++++++++++++++++++++ |
15 |
kde-plasma/kwin/kwin-5.19.5-r1.ebuild | 113 ++++++++++++++ |
16 |
2 files changed, 275 insertions(+) |
17 |
|
18 |
diff --git a/kde-plasma/kwin/files/kwin-5.19.5-safe-removal-of-X11-event-filters.patch b/kde-plasma/kwin/files/kwin-5.19.5-safe-removal-of-X11-event-filters.patch |
19 |
new file mode 100644 |
20 |
index 00000000000..7eeccf6e8c5 |
21 |
--- /dev/null |
22 |
+++ b/kde-plasma/kwin/files/kwin-5.19.5-safe-removal-of-X11-event-filters.patch |
23 |
@@ -0,0 +1,162 @@ |
24 |
+From c5880833d94330d022c4b6fc84c175aadeaf9632 Mon Sep 17 00:00:00 2001 |
25 |
+From: Vlad Zahorodnii <vlad.zahorodnii@×××.org> |
26 |
+Date: Tue, 22 Sep 2020 08:53:17 +0000 |
27 |
+Subject: [PATCH] x11: Make removal of X11 event filters safe |
28 |
+ |
29 |
+If an X11 event filter has been activated and it unregisters another X11 |
30 |
+event filter, then the window manager may crash because the foreach macro |
31 |
+in Workspace::workspaceEvent() makes a copy of m_genericEventFilters or |
32 |
+m_eventFilters and we can call the event() method for an already defunct |
33 |
+filter. |
34 |
+ |
35 |
+With this change, X11 event filters can be safely removed and installed |
36 |
+at any particular moment. |
37 |
+ |
38 |
+BUG: 423319 |
39 |
+ |
40 |
+ |
41 |
+(cherry picked from commit a433fb08a3a9255802405a17dd4c8270c68fcb25) |
42 |
+--- |
43 |
+ events.cpp | 52 +++++++++++++++++++++++++++++++++++++++++---------- |
44 |
+ workspace.cpp | 10 ++++++++++ |
45 |
+ workspace.h | 17 +++++++++++++++-- |
46 |
+ 3 files changed, 67 insertions(+), 12 deletions(-) |
47 |
+ |
48 |
+diff --git a/events.cpp b/events.cpp |
49 |
+index eb3572d13..2e8885d76 100644 |
50 |
+--- a/events.cpp |
51 |
++++ b/events.cpp |
52 |
+@@ -165,18 +165,34 @@ QVector<QByteArray> s_xcbEerrors({ |
53 |
+ |
54 |
+ void Workspace::registerEventFilter(X11EventFilter *filter) |
55 |
+ { |
56 |
+- if (filter->isGenericEvent()) |
57 |
+- m_genericEventFilters.append(filter); |
58 |
+- else |
59 |
+- m_eventFilters.append(filter); |
60 |
++ if (filter->isGenericEvent()) { |
61 |
++ m_genericEventFilters.append(new X11EventFilterContainer(filter)); |
62 |
++ } else { |
63 |
++ m_eventFilters.append(new X11EventFilterContainer(filter)); |
64 |
++ } |
65 |
++} |
66 |
++ |
67 |
++static X11EventFilterContainer *takeEventFilter(X11EventFilter *eventFilter, |
68 |
++ QList<QPointer<X11EventFilterContainer>> &list) |
69 |
++{ |
70 |
++ for (int i = 0; i < list.count(); ++i) { |
71 |
++ X11EventFilterContainer *container = list.at(i); |
72 |
++ if (container->filter() == eventFilter) { |
73 |
++ return list.takeAt(i); |
74 |
++ } |
75 |
++ } |
76 |
++ return nullptr; |
77 |
+ } |
78 |
+ |
79 |
+ void Workspace::unregisterEventFilter(X11EventFilter *filter) |
80 |
+ { |
81 |
+- if (filter->isGenericEvent()) |
82 |
+- m_genericEventFilters.removeOne(filter); |
83 |
+- else |
84 |
+- m_eventFilters.removeOne(filter); |
85 |
++ X11EventFilterContainer *container = nullptr; |
86 |
++ if (filter->isGenericEvent()) { |
87 |
++ container = takeEventFilter(filter, m_genericEventFilters); |
88 |
++ } else { |
89 |
++ container = takeEventFilter(filter, m_eventFilters); |
90 |
++ } |
91 |
++ delete container; |
92 |
+ } |
93 |
+ |
94 |
+ |
95 |
+@@ -219,13 +235,29 @@ bool Workspace::workspaceEvent(xcb_generic_event_t *e) |
96 |
+ if (eventType == XCB_GE_GENERIC) { |
97 |
+ xcb_ge_generic_event_t *ge = reinterpret_cast<xcb_ge_generic_event_t *>(e); |
98 |
+ |
99 |
+- foreach (X11EventFilter *filter, m_genericEventFilters) { |
100 |
++ // We need to make a shadow copy of the event filter list because an activated event |
101 |
++ // filter may mutate it by removing or installing another event filter. |
102 |
++ const auto eventFilters = m_genericEventFilters; |
103 |
++ |
104 |
++ for (X11EventFilterContainer *container : eventFilters) { |
105 |
++ if (!container) { |
106 |
++ continue; |
107 |
++ } |
108 |
++ X11EventFilter *filter = container->filter(); |
109 |
+ if (filter->extension() == ge->extension && filter->genericEventTypes().contains(ge->event_type) && filter->event(e)) { |
110 |
+ return true; |
111 |
+ } |
112 |
+ } |
113 |
+ } else { |
114 |
+- foreach (X11EventFilter *filter, m_eventFilters) { |
115 |
++ // We need to make a shadow copy of the event filter list because an activated event |
116 |
++ // filter may mutate it by removing or installing another event filter. |
117 |
++ const auto eventFilters = m_eventFilters; |
118 |
++ |
119 |
++ for (X11EventFilterContainer *container : eventFilters) { |
120 |
++ if (!container) { |
121 |
++ continue; |
122 |
++ } |
123 |
++ X11EventFilter *filter = container->filter(); |
124 |
+ if (filter->eventTypes().contains(eventType) && filter->event(e)) { |
125 |
+ return true; |
126 |
+ } |
127 |
+diff --git a/workspace.cpp b/workspace.cpp |
128 |
+index a87a622e9..fd3634b16 100644 |
129 |
+--- a/workspace.cpp |
130 |
++++ b/workspace.cpp |
131 |
+@@ -66,6 +66,16 @@ namespace KWin |
132 |
+ extern int screen_number; |
133 |
+ extern bool is_multihead; |
134 |
+ |
135 |
++X11EventFilterContainer::X11EventFilterContainer(X11EventFilter *filter) |
136 |
++ : m_filter(filter) |
137 |
++{ |
138 |
++} |
139 |
++ |
140 |
++X11EventFilter *X11EventFilterContainer::filter() const |
141 |
++{ |
142 |
++ return m_filter; |
143 |
++} |
144 |
++ |
145 |
+ ColorMapper::ColorMapper(QObject *parent) |
146 |
+ : QObject(parent) |
147 |
+ , m_default(kwinApp()->x11DefaultScreen()->default_colormap) |
148 |
+diff --git a/workspace.h b/workspace.h |
149 |
+index 489d7bae4..61fb215a8 100644 |
150 |
+--- a/workspace.h |
151 |
++++ b/workspace.h |
152 |
+@@ -55,6 +55,19 @@ class X11Client; |
153 |
+ class X11EventFilter; |
154 |
+ enum class Predicate; |
155 |
+ |
156 |
++class X11EventFilterContainer : public QObject |
157 |
++{ |
158 |
++ Q_OBJECT |
159 |
++ |
160 |
++public: |
161 |
++ explicit X11EventFilterContainer(X11EventFilter *filter); |
162 |
++ |
163 |
++ X11EventFilter *filter() const; |
164 |
++ |
165 |
++private: |
166 |
++ X11EventFilter *m_filter; |
167 |
++}; |
168 |
++ |
169 |
+ class KWIN_EXPORT Workspace : public QObject |
170 |
+ { |
171 |
+ Q_OBJECT |
172 |
+@@ -654,8 +667,8 @@ private: |
173 |
+ |
174 |
+ QScopedPointer<KillWindow> m_windowKiller; |
175 |
+ |
176 |
+- QList<X11EventFilter *> m_eventFilters; |
177 |
+- QList<X11EventFilter *> m_genericEventFilters; |
178 |
++ QList<QPointer<X11EventFilterContainer>> m_eventFilters; |
179 |
++ QList<QPointer<X11EventFilterContainer>> m_genericEventFilters; |
180 |
+ QScopedPointer<X11EventFilter> m_movingClientFilter; |
181 |
+ QScopedPointer<X11EventFilter> m_syncAlarmFilter; |
182 |
+ |
183 |
+-- |
184 |
+GitLab |
185 |
+ |
186 |
|
187 |
diff --git a/kde-plasma/kwin/kwin-5.19.5-r1.ebuild b/kde-plasma/kwin/kwin-5.19.5-r1.ebuild |
188 |
new file mode 100644 |
189 |
index 00000000000..d3058de6442 |
190 |
--- /dev/null |
191 |
+++ b/kde-plasma/kwin/kwin-5.19.5-r1.ebuild |
192 |
@@ -0,0 +1,113 @@ |
193 |
+# Copyright 1999-2020 Gentoo Authors |
194 |
+# Distributed under the terms of the GNU General Public License v2 |
195 |
+ |
196 |
+EAPI=7 |
197 |
+ |
198 |
+ECM_HANDBOOK="optional" |
199 |
+ECM_TEST="optional" |
200 |
+KFMIN=5.71.0 |
201 |
+PVCUT=$(ver_cut 1-3) |
202 |
+QTMIN=5.14.2 |
203 |
+VIRTUALX_REQUIRED="test" |
204 |
+inherit ecm kde.org |
205 |
+ |
206 |
+DESCRIPTION="Flexible, composited Window Manager for windowing systems on Linux" |
207 |
+ |
208 |
+LICENSE="GPL-2+" |
209 |
+SLOT="5" |
210 |
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86" |
211 |
+IUSE="caps gles2-only multimedia" |
212 |
+ |
213 |
+COMMON_DEPEND=" |
214 |
+ >=dev-libs/libinput-1.14 |
215 |
+ >=dev-libs/wayland-1.2 |
216 |
+ >=dev-qt/qtdbus-${QTMIN}:5 |
217 |
+ >=dev-qt/qtdeclarative-${QTMIN}:5 |
218 |
+ >=dev-qt/qtgui-${QTMIN}:5=[gles2-only=] |
219 |
+ >=dev-qt/qtscript-${QTMIN}:5 |
220 |
+ >=dev-qt/qtsensors-${QTMIN}:5 |
221 |
+ >=dev-qt/qtwidgets-${QTMIN}:5 |
222 |
+ >=dev-qt/qtx11extras-${QTMIN}:5 |
223 |
+ >=kde-frameworks/kactivities-${KFMIN}:5 |
224 |
+ >=kde-frameworks/kauth-${KFMIN}:5 |
225 |
+ >=kde-frameworks/kcmutils-${KFMIN}:5 |
226 |
+ >=kde-frameworks/kcompletion-${KFMIN}:5 |
227 |
+ >=kde-frameworks/kconfig-${KFMIN}:5 |
228 |
+ >=kde-frameworks/kconfigwidgets-${KFMIN}:5 |
229 |
+ >=kde-frameworks/kcoreaddons-${KFMIN}:5 |
230 |
+ >=kde-frameworks/kcrash-${KFMIN}:5 |
231 |
+ >=kde-frameworks/kdeclarative-${KFMIN}:5 |
232 |
+ >=kde-frameworks/kglobalaccel-${KFMIN}:5= |
233 |
+ >=kde-frameworks/ki18n-${KFMIN}:5 |
234 |
+ >=kde-frameworks/kiconthemes-${KFMIN}:5 |
235 |
+ >=kde-frameworks/kidletime-${KFMIN}:5= |
236 |
+ >=kde-frameworks/kio-${KFMIN}:5 |
237 |
+ >=kde-frameworks/knewstuff-${KFMIN}:5 |
238 |
+ >=kde-frameworks/knotifications-${KFMIN}:5 |
239 |
+ >=kde-frameworks/kpackage-${KFMIN}:5 |
240 |
+ >=kde-frameworks/kservice-${KFMIN}:5 |
241 |
+ >=kde-frameworks/ktextwidgets-${KFMIN}:5 |
242 |
+ >=kde-frameworks/kwayland-${KFMIN}:5 |
243 |
+ >=kde-frameworks/kwidgetsaddons-${KFMIN}:5 |
244 |
+ >=kde-frameworks/kwindowsystem-${KFMIN}:5[X] |
245 |
+ >=kde-frameworks/kxmlgui-${KFMIN}:5 |
246 |
+ >=kde-frameworks/plasma-${KFMIN}:5 |
247 |
+ >=kde-plasma/breeze-${PVCUT}:5 |
248 |
+ >=kde-plasma/kdecoration-${PVCUT}:5 |
249 |
+ >=kde-plasma/kscreenlocker-${PVCUT}:5 |
250 |
+ >=kde-plasma/kwayland-server-${PVCUT}:5 |
251 |
+ media-libs/fontconfig |
252 |
+ media-libs/freetype |
253 |
+ media-libs/libepoxy |
254 |
+ media-libs/mesa[egl,gbm,wayland,X(+)] |
255 |
+ virtual/libudev:= |
256 |
+ x11-libs/libICE |
257 |
+ x11-libs/libSM |
258 |
+ x11-libs/libX11 |
259 |
+ x11-libs/libXi |
260 |
+ x11-libs/libdrm |
261 |
+ >=x11-libs/libxcb-1.10 |
262 |
+ >=x11-libs/libxkbcommon-0.7.0 |
263 |
+ x11-libs/xcb-util-cursor |
264 |
+ x11-libs/xcb-util-image |
265 |
+ x11-libs/xcb-util-keysyms |
266 |
+ x11-libs/xcb-util-wm |
267 |
+ caps? ( sys-libs/libcap ) |
268 |
+ gles2-only? ( media-libs/mesa[gles2] ) |
269 |
+" |
270 |
+# TODO: sys-apps/hwdata? not packaged yet; commit 33a1777a, Gentoo-bug 717216 |
271 |
+RDEPEND="${COMMON_DEPEND} |
272 |
+ >=dev-qt/qtquickcontrols-${QTMIN}:5 |
273 |
+ >=dev-qt/qtquickcontrols2-${QTMIN}:5 |
274 |
+ >=dev-qt/qtvirtualkeyboard-${QTMIN}:5 |
275 |
+ >=kde-frameworks/kirigami-${KFMIN}:5 |
276 |
+ >=kde-frameworks/kitemmodels-${KFMIN}:5[qml] |
277 |
+ multimedia? ( >=dev-qt/qtmultimedia-${QTMIN}:5[gstreamer,qml] ) |
278 |
+" |
279 |
+DEPEND="${COMMON_DEPEND} |
280 |
+ >=dev-qt/designer-${QTMIN}:5 |
281 |
+ >=dev-qt/qtconcurrent-${QTMIN}:5 |
282 |
+ x11-base/xorg-proto |
283 |
+" |
284 |
+PDEPEND=" |
285 |
+ >=kde-plasma/kde-cli-tools-${PVCUT}:5 |
286 |
+" |
287 |
+ |
288 |
+RESTRICT+=" test" |
289 |
+ |
290 |
+PATCHES=( |
291 |
+ "${FILESDIR}"/${P}-safe-removal-of-X11-event-filters.patch # KDE-Bug 423319 |
292 |
+) |
293 |
+ |
294 |
+src_prepare() { |
295 |
+ ecm_src_prepare |
296 |
+ use multimedia || eapply "${FILESDIR}/${PN}-5.16.80-gstreamer-optional.patch" |
297 |
+} |
298 |
+ |
299 |
+src_configure() { |
300 |
+ local mycmakeargs=( |
301 |
+ $(cmake_use_find_package caps Libcap) |
302 |
+ ) |
303 |
+ |
304 |
+ ecm_src_configure |
305 |
+} |