From 895aee564faebb113bd00cf45d42105b913ab2f9 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Tue, 26 Feb 2019 14:39:38 +0000 Subject: [PATCH] Guard virtualDesktopManagement being accessed before fetched Summary: The WaylandPrivate::virtualDesktopManagement object is loaded asyncronously. It's null until we finish fetching the registry. A code path could call the desktopNames in that time. Test Plan: Had a crash Couldn't reproduce reliably Reviewers: #plasma, hein Reviewed By: #plasma, hein Subscribers: hein, plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D19029 --- libtaskmanager/virtualdesktopinfo.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libtaskmanager/virtualdesktopinfo.cpp b/libtaskmanager/virtualdesktopinfo.cpp index 7c4e1dd22..602d3667e 100644 --- a/libtaskmanager/virtualdesktopinfo.cpp +++ b/libtaskmanager/virtualdesktopinfo.cpp @@ -336,6 +336,9 @@ QVariantList VirtualDesktopInfo::WaylandPrivate::desktopIds() const QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const { + if (!virtualDesktopManagement) { + return QStringList(); + } QStringList names; foreach(const QString &id, virtualDesktops) { @@ -351,11 +354,18 @@ QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const int VirtualDesktopInfo::WaylandPrivate::desktopLayoutRows() const { + if (!virtualDesktopManagement) { + return 0; + } + return virtualDesktopManagement->rows(); } void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop) { + if (!virtualDesktopManagement) { + return; + } KWayland::Client::PlasmaVirtualDesktop *desktopObj = virtualDesktopManagement->getVirtualDesktop(desktop.toString()); if (desktopObj) { @@ -365,11 +375,17 @@ void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop void VirtualDesktopInfo::WaylandPrivate::requestCreateDesktop(quint32 position) { + if (!virtualDesktopManagement) { + return; + } virtualDesktopManagement->requestCreateVirtualDesktop(i18n("New Desktop"), position); } void VirtualDesktopInfo::WaylandPrivate::requestRemoveDesktop(quint32 position) { + if (!virtualDesktopManagement) { + return; + } if (virtualDesktops.count() == 1) { return; }