From 6568802c95428a09aadbd7904050c39642e60c44 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Wed, 28 Aug 2019 18:38:25 +0100 Subject: [PATCH] [server] Wrap proxyRemoveSurface in smart pointer Summary: proxyRemoteSurface is a fake wayland surface created for the drag and drop between X and wayland clients. The lifespan is not guaranteed to outlive the DataDevice. Kwin closes Xwl before the other wayland client connections so it's technically dangling for a bit when events could be dispatched. Probably will never happen, but better to guard and be safe. Test Plan: Compiles Reviewers: #kwin, zzag Reviewed By: #kwin, zzag Subscribers: kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D22862 --- src/wayland/datadevice_interface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wayland/datadevice_interface.cpp b/src/wayland/datadevice_interface.cpp index 51f8737aa5..18a9d733ff 100644 --- a/src/wayland/datadevice_interface.cpp +++ b/src/wayland/datadevice_interface.cpp @@ -61,7 +61,7 @@ public: }; Drag drag; - SurfaceInterface *proxyRemoteSurface = nullptr; + QPointer proxyRemoteSurface; private: DataDeviceInterface *q_func() { @@ -104,7 +104,7 @@ void DataDeviceInterface::Private::startDrag(DataSourceInterface *dataSource, Su SurfaceInterface *focusSurface = origin; if (proxyRemoteSurface) { // origin is a proxy surface - focusSurface = proxyRemoteSurface; + focusSurface = proxyRemoteSurface.data(); } const bool pointerGrab = seat->hasImplicitPointerGrab(serial) && seat->focusedPointerSurface() == focusSurface; if (!pointerGrab) { @@ -216,7 +216,7 @@ SurfaceInterface *DataDeviceInterface::icon() const SurfaceInterface *DataDeviceInterface::origin() const { Q_D(); - return d->proxyRemoteSurface ? d->proxyRemoteSurface : d->surface; + return d->proxyRemoteSurface ? d->proxyRemoteSurface.data() : d->surface; } DataSourceInterface *DataDeviceInterface::selection() const