[SCM] kio packaging branch, master, updated. debian/5.28.0-1-14-g6a34213
Maximiliano Curia
maxy at moszumanska.debian.org
Wed Apr 5 08:43:39 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/frameworks/kio.git;a=commitdiff;h=9a721ac
The following commit has been merged in the master branch:
commit 9a721accb6898e40d0bc5547c6fd7c83a85fdacb
Author: Maximiliano Curia <maxy at gnuservers.com.ar>
Date: Tue Apr 4 17:38:51 2017 +0200
Add new upstream patch: Fix-memleak-in-KDynamicJobTracker-KWidgetJobTracker-needs.patch
---
...DynamicJobTracker-KWidgetJobTracker-needs.patch | 236 +++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 237 insertions(+)
diff --git a/debian/patches/Fix-memleak-in-KDynamicJobTracker-KWidgetJobTracker-needs.patch b/debian/patches/Fix-memleak-in-KDynamicJobTracker-KWidgetJobTracker-needs.patch
new file mode 100644
index 0000000..0a63a01
--- /dev/null
+++ b/debian/patches/Fix-memleak-in-KDynamicJobTracker-KWidgetJobTracker-needs.patch
@@ -0,0 +1,236 @@
+From: "Friedrich W. H. Kossebau" <kossebau at kde.org>
+Date: Thu, 5 Jan 2017 03:08:45 +0100
+Subject: Fix memleak in KDynamicJobTracker,
+ KWidgetJobTracker needs QApplication
+
+Summary:
+KDynamicJobTracker was not cleaning up its internal job tracking
+data structure on finished jobs.
+Also was it trying to create a KWidgetJobTracker even if there
+was no QApplication instance.
+
+Reviewers: #frameworks, kfunk
+
+Reviewed By: kfunk
+
+Subscribers: kfunk
+
+Tags: #frameworks
+
+Differential Revision: https://phabricator.kde.org/D3977
+---
+ autotests/CMakeLists.txt | 1 +
+ autotests/kdynamicjobtrackernowidgetstest.cpp | 69 ++++++++++++++++++++++++
+ src/widgets/kdynamicjobtracker.cpp | 77 +++++++++++++++++++--------
+ 3 files changed, 124 insertions(+), 23 deletions(-)
+ create mode 100644 autotests/kdynamicjobtrackernowidgetstest.cpp
+
+diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt
+index 436b5d95..0e2d252a 100644
+--- a/autotests/CMakeLists.txt
++++ b/autotests/CMakeLists.txt
+@@ -68,6 +68,7 @@ if (TARGET KF5::KIOWidgets)
+ ecm_add_tests(
+ clipboardupdatertest.cpp
+ dropjobtest.cpp
++ kdynamicjobtrackernowidgetstest.cpp
+ krununittest.cpp
+ kdirlistertest.cpp
+ kdirmodeltest.cpp
+diff --git a/autotests/kdynamicjobtrackernowidgetstest.cpp b/autotests/kdynamicjobtrackernowidgetstest.cpp
+new file mode 100644
+index 00000000..a8dbee05
+--- /dev/null
++++ b/autotests/kdynamicjobtrackernowidgetstest.cpp
+@@ -0,0 +1,69 @@
++/* This file is part of the KDE project
++ Copyright 2017 Friedrich W. H. Kossebau <kossebau at kde.org>
++
++ This library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Library General Public
++ License as published by the Free Software Foundation; either
++ version 2 of the License, or (at your option) any later version.
++
++ This library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Library General Public License for more details.
++
++ You should have received a copy of the GNU Library General Public License
++ along with this library; see the file COPYING.LIB. If not, write to
++ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ Boston, MA 02110-1301, USA.
++ */
++
++#include <KIO/JobTracker>
++#include <KJobTrackerInterface>
++#include <KJob>
++
++#include <QtTest>
++#include <QEventLoop>
++
++// widget is shown with hardcoded delay of 500 ms by KWidgetJobTracker
++static const int testJobRunningTime = 600;
++
++class TestJob : public KJob
++{
++ Q_OBJECT
++public:
++ void start() Q_DECL_OVERRIDE { QTimer::singleShot(testJobRunningTime, this, &TestJob::doEmit); }
++
++private Q_SLOTS:
++ void doEmit() { emitResult(); }
++};
++
++
++class KDynamicJobTrackerTest : public QObject
++{
++ Q_OBJECT
++
++private Q_SLOTS:
++ void testNoCrashWithoutQWidgetsPossible();
++};
++
++void KDynamicJobTrackerTest::testNoCrashWithoutQWidgetsPossible()
++{
++ // simply linking to KIOWidgets results in KDynamicJobTracker installing itself as KIO's jobtracker
++ KJobTrackerInterface* jobtracker = KIO::getJobTracker();
++ QCOMPARE(jobtracker->metaObject()->className(), "KDynamicJobTracker");
++
++ TestJob *job = new TestJob;
++
++ jobtracker->registerJob(job);
++
++ job->start();
++ QEventLoop loop;
++ connect(job, &KJob::result, &loop, &QEventLoop::quit);
++ loop.exec();
++ // if we are here, no crash has happened due to QWidgets tried to be used -> success
++}
++
++// GUILESS, so QWidgets are not possible
++QTEST_GUILESS_MAIN(KDynamicJobTrackerTest)
++
++#include "kdynamicjobtrackernowidgetstest.moc"
+diff --git a/src/widgets/kdynamicjobtracker.cpp b/src/widgets/kdynamicjobtracker.cpp
+index 14924d5b..867489f6 100644
+--- a/src/widgets/kdynamicjobtracker.cpp
++++ b/src/widgets/kdynamicjobtracker.cpp
+@@ -25,6 +25,7 @@
+ #include <kjobtrackerinterface.h>
+ #include <kio/jobtracker.h>
+
++#include <QApplication>
+ #include <QDBusConnection>
+ #include <QDBusConnectionInterface>
+ #include <QDBusInterface>
+@@ -68,49 +69,77 @@ KDynamicJobTracker::~KDynamicJobTracker()
+
+ void KDynamicJobTracker::registerJob(KJob *job)
+ {
++ if (d->trackers.contains(job)) {
++ return;
++ }
++
++ // only interested in finished() signal,
++ // so catching ourselves instead of using KJobTrackerInterface::registerJob()
++ connect(job, &KJob::finished,
++ this, &KDynamicJobTracker::unregisterJob);
++
++ const bool canHaveWidgets = (qobject_cast<QApplication *>(qApp) != nullptr);
++
++ // always add an entry, even with no trackers used at all,
++ // so unregisterJob() will work as normal
++ AllTrackers& trackers = d->trackers[job];
++
+ // do not try to query kuiserver if dbus is not available
+ if (!QDBusConnection::sessionBus().interface()) {
+- // fallback to widget tracker only!
+- if (!d->widgetTracker) {
+- d->widgetTracker = new KWidgetJobTracker();
++ if (canHaveWidgets) {
++ // fallback to widget tracker only!
++ if (!d->widgetTracker) {
++ d->widgetTracker = new KWidgetJobTracker();
++ }
++
++ trackers.widgetTracker = d->widgetTracker;
++ trackers.widgetTracker->registerJob(job);
++ } else {
++ trackers.widgetTracker = nullptr;
+ }
+- d->trackers[job].widgetTracker = d->widgetTracker;
+- d->trackers[job].widgetTracker->registerJob(job);
++
++ trackers.kuiserverTracker = nullptr;
+ } else {
+ if (!d->kuiserverTracker) {
+ d->kuiserverTracker = new KUiServerJobTracker();
+ }
+
+- d->trackers[job].kuiserverTracker = d->kuiserverTracker;
+- d->trackers[job].kuiserverTracker->registerJob(job);
+-
+- QDBusInterface interface(QStringLiteral("org.kde.kuiserver"), QStringLiteral("/JobViewServer"), QLatin1String(""),
+- QDBusConnection::sessionBus(), this);
+- QDBusReply<bool> reply = interface.call(QStringLiteral("requiresJobTracker"));
+-
+- if (reply.isValid() && reply.value()) {
+- //create a widget tracker in addition to kuiservertracker.
+- if (!d->widgetTracker) {
+- d->widgetTracker = new KWidgetJobTracker();
++ trackers.kuiserverTracker = d->kuiserverTracker;
++ trackers.kuiserverTracker->registerJob(job);
++
++ trackers.widgetTracker = nullptr;
++ if (canHaveWidgets) {
++ QDBusInterface interface(QStringLiteral("org.kde.kuiserver"), QStringLiteral("/JobViewServer"), QLatin1String(""),
++ QDBusConnection::sessionBus(), this);
++ QDBusReply<bool> reply = interface.call(QStringLiteral("requiresJobTracker"));
++
++ if (reply.isValid() && reply.value()) {
++ // create a widget tracker in addition to kuiservertracker.
++ if (!d->widgetTracker) {
++ d->widgetTracker = new KWidgetJobTracker();
++ }
++ trackers.widgetTracker = d->widgetTracker;
++ trackers.widgetTracker->registerJob(job);
+ }
+- d->trackers[job].widgetTracker = d->widgetTracker;
+- d->trackers[job].widgetTracker->registerJob(job);
+ }
+ }
+-
+- Q_ASSERT(d->trackers[job].kuiserverTracker || d->trackers[job].widgetTracker);
+ }
+
+ void KDynamicJobTracker::unregisterJob(KJob *job)
+ {
+- KUiServerJobTracker *kuiserverTracker = d->trackers[job].kuiserverTracker;
+- KWidgetJobTracker *widgetTracker = d->trackers[job].widgetTracker;
++ job->disconnect(this);
++
++ QMap<KJob*, AllTrackers>::Iterator it = d->trackers.find(job);
+
+- if (!(widgetTracker || kuiserverTracker)) {
++ if (it == d->trackers.end()) {
+ qWarning() << "Tried to unregister a kio job that hasn't been registered.";
+ return;
+ }
+
++ const AllTrackers& trackers = it.value();
++ KUiServerJobTracker *kuiserverTracker = trackers.kuiserverTracker;
++ KWidgetJobTracker *widgetTracker = trackers.widgetTracker;
++
+ if (kuiserverTracker) {
+ kuiserverTracker->unregisterJob(job);
+ }
+@@ -118,6 +147,8 @@ void KDynamicJobTracker::unregisterJob(KJob *job)
+ if (widgetTracker) {
+ widgetTracker->unregisterJob(job);
+ }
++
++ d->trackers.erase(it);
+ }
+
+ Q_GLOBAL_STATIC(KDynamicJobTracker, globalJobTracker)
diff --git a/debian/patches/series b/debian/patches/series
index 88da383..e8963c3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -10,3 +10,4 @@ Allow-uppercase-checksums-matching-in-Checksums-tab.patch
ForwardingSlaveBase-fix-passing-of-Overwrite-flag-to-kio_.patch
Fix-another-clear-porting-bug-in-ForwardingSlaveBase.patch
kssl-Ensure-user-certificate-directory-has-been-created-b.patch
+Fix-memleak-in-KDynamicJobTracker-KWidgetJobTracker-needs.patch
--
kio packaging
More information about the pkg-kde-commits
mailing list