From 854b64fc130b8e1c3a254bf087bb162616cc8041 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Tue, 18 Feb 2020 12:34:13 +0000 Subject: [PATCH] [plasma-session] Avoid hypothetical race condition starting a service Summary: If for some reason a service is started before StartServiceJob runs, we will end up blocking forever. Test Plan: Logged in Reviewers: #plasma, apol Reviewed By: apol Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D27471 --- startkde/plasma-session/startup.cpp | 9 ++++++++- startkde/plasma-session/startup.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/startkde/plasma-session/startup.cpp b/startkde/plasma-session/startup.cpp index b4fa188e4..31cd13491 100644 --- a/startkde/plasma-session/startup.cpp +++ b/startkde/plasma-session/startup.cpp @@ -417,7 +417,8 @@ void AutoStartAppsJob::start() { StartServiceJob::StartServiceJob(const QString &process, const QStringList &args, const QString &serviceId): KJob(), m_process(process), - m_args(args) + m_args(args), + m_serviceId(serviceId) { auto watcher = new QDBusServiceWatcher(serviceId, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForRegistration, this); connect(watcher, &QDBusServiceWatcher::serviceRegistered, this, &StartServiceJob::emitResult); @@ -425,6 +426,12 @@ StartServiceJob::StartServiceJob(const QString &process, const QStringList &args void StartServiceJob::start() { + if (QDBusConnection::sessionBus().interface()->isServiceRegistered(m_serviceId)) { + qCDebug(PLASMA_SESSION) << m_process << "already running"; + emitResult(); + return; + } + qCDebug(PLASMA_SESSION) << "Starting " << m_process << m_args; QProcess::startDetached(m_process, m_args); } diff --git a/startkde/plasma-session/startup.h b/startkde/plasma-session/startup.h index bac744648..6e996f6c4 100644 --- a/startkde/plasma-session/startup.h +++ b/startkde/plasma-session/startup.h @@ -92,6 +92,7 @@ public: private: const QString m_process; const QStringList m_args; + const QString m_serviceId; }; class RestoreSessionJob: public KJob