Gentoo Archives: gentoo-commits

From: Andreas Sturmlechner <asturm@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: kde-plasma/kwin/files/, kde-plasma/kwin/
Date: Sun, 04 Oct 2020 16:07:23
Message-Id: 1601826848.804a1b3955488d8b00768d15a2748a97ca615eb6.asturm@gentoo
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 +}