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
wilder-broken-krunner
David Edmundson 7 years ago
parent fafddc4dec
commit 895aee564f
  1. 16
      libtaskmanager/virtualdesktopinfo.cpp

@ -336,6 +336,9 @@ QVariantList VirtualDesktopInfo::WaylandPrivate::desktopIds() const
QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const
{ {
if (!virtualDesktopManagement) {
return QStringList();
}
QStringList names; QStringList names;
foreach(const QString &id, virtualDesktops) { foreach(const QString &id, virtualDesktops) {
@ -351,11 +354,18 @@ QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const
int VirtualDesktopInfo::WaylandPrivate::desktopLayoutRows() const int VirtualDesktopInfo::WaylandPrivate::desktopLayoutRows() const
{ {
if (!virtualDesktopManagement) {
return 0;
}
return virtualDesktopManagement->rows(); return virtualDesktopManagement->rows();
} }
void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop) void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop)
{ {
if (!virtualDesktopManagement) {
return;
}
KWayland::Client::PlasmaVirtualDesktop *desktopObj = virtualDesktopManagement->getVirtualDesktop(desktop.toString()); KWayland::Client::PlasmaVirtualDesktop *desktopObj = virtualDesktopManagement->getVirtualDesktop(desktop.toString());
if (desktopObj) { if (desktopObj) {
@ -365,11 +375,17 @@ void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop
void VirtualDesktopInfo::WaylandPrivate::requestCreateDesktop(quint32 position) void VirtualDesktopInfo::WaylandPrivate::requestCreateDesktop(quint32 position)
{ {
if (!virtualDesktopManagement) {
return;
}
virtualDesktopManagement->requestCreateVirtualDesktop(i18n("New Desktop"), position); virtualDesktopManagement->requestCreateVirtualDesktop(i18n("New Desktop"), position);
} }
void VirtualDesktopInfo::WaylandPrivate::requestRemoveDesktop(quint32 position) void VirtualDesktopInfo::WaylandPrivate::requestRemoveDesktop(quint32 position)
{ {
if (!virtualDesktopManagement) {
return;
}
if (virtualDesktops.count() == 1) { if (virtualDesktops.count() == 1) {
return; return;
} }

Loading…
Cancel
Save