Christophe Giboudeaux 2020-09-02 11:40:57 +00:00 committed by Git OBS Bridge
parent 561834585c
commit f00915abed
3 changed files with 77 additions and 1 deletions

View File

@ -0,0 +1,69 @@
From 66d1135d127331fb3a2a7e047b0577d7e67d3dc2 Mon Sep 17 00:00:00 2001
From: Ahmad Samir <a.samirh78@gmail.com>
Date: Wed, 2 Sep 2020 10:20:37 +0000
Subject: [PATCH] AgentBase: Fix crash in setOnline
When setOnline tries to access the mSettings member after the latter has
been deleted we get a crash; mSettings is deleted in quit() or cleanup(),
therefore it looks like a race condition: the Agent is about to quit, but
some other code calls setOnline leading to a crash. It looks like this can
happen in more than one way, e.g. via a dbus call (from AgentInstance), or
via a sub-class of AgentBase calling setOnline directly. Use a bool member
var, modelled after how AgentInstance uses a similar logic.
BUG: 418844
(cherry picked from commit 53574eb6fccc8f6a03dcea6c1ca1aa02dd895209)
---
src/agentbase/agentbase.cpp | 8 ++++++++
src/agentbase/agentbase_p.h | 2 ++
2 files changed, 10 insertions(+)
diff --git a/src/agentbase/agentbase.cpp b/src/agentbase/agentbase.cpp
index 94d8ccc02..025f90c69 100644
--- a/src/agentbase/agentbase.cpp
+++ b/src/agentbase/agentbase.cpp
@@ -333,6 +333,7 @@ AgentBasePrivate::AgentBasePrivate(AgentBase *parent)
, mNeedsNetwork(false)
, mOnline(false)
, mDesiredOnlineState(false)
+ , mPendingQuit(false)
, mSettings(nullptr)
, mChangeRecorder(nullptr)
, mTracer(nullptr)
@@ -1006,6 +1007,11 @@ void AgentBase::setNeedsNetwork(bool needsNetwork)
void AgentBase::setOnline(bool state)
{
Q_D(AgentBase);
+
+ if (d->mPendingQuit) {
+ return;
+ }
+
d->mDesiredOnlineState = state;
d->mSettings->setValue(QStringLiteral("Agent/DesiredOnlineState"), state);
setOnlineInternal(state);
@@ -1126,6 +1132,8 @@ void AgentBase::quit()
void AgentBase::aboutToQuit()
{
+ Q_D(AgentBase);
+ d->mPendingQuit = true;
}
void AgentBase::cleanup()
diff --git a/src/agentbase/agentbase_p.h b/src/agentbase/agentbase_p.h
index a70846ce9..2353e7281 100644
--- a/src/agentbase/agentbase_p.h
+++ b/src/agentbase/agentbase_p.h
@@ -88,6 +88,8 @@ public:
bool mOnline;
bool mDesiredOnlineState;
+ bool mPendingQuit;
+
QSettings *mSettings = nullptr;
ChangeRecorder *mChangeRecorder = nullptr;
--
2.28.0

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Sep 2 11:40:13 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Add upstream patch to fix crashes:
* 0001-AgentBase-Fix-crash-in-setOnline.patch
-------------------------------------------------------------------
Tue Sep 1 20:48:47 UTC 2020 - Luca Beltrame <lbeltrame@kde.org>

View File

@ -30,6 +30,7 @@ Group: System/GUI/KDE
URL: https://akonadi-project.org
Source: https://download.kde.org/stable/release-service/%{version}/src/%{rname}-%{version}.tar.xz
Source99: akonadi-server-rpmlintrc
Patch0: 0001-AgentBase-Fix-crash-in-setOnline.patch
BuildRequires: extra-cmake-modules >= %{kf5_version}
BuildRequires: kf5-filesystem
BuildRequires: libQt5Sql-private-headers-devel
@ -166,7 +167,7 @@ service.
%lang_package
%prep
%setup -q -n %{rname}-%{version}
%autosetup -p1 -n %{rname}-%{version}
%build
%cmake_kf5 -d build -- -DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE -DQT_PLUGINS_DIR=%{_kf5_plugindir} -DINSTALL_APPARMOR=FALSE