Hello community, here is the log from the commit of package akonadi-server for openSUSE:Factory checked in at 2016-07-21 07:41:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/akonadi-server (Old) and /work/SRC/openSUSE:Factory/.akonadi-server.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "akonadi-server" Changes: -------- --- /work/SRC/openSUSE:Factory/akonadi-server/akonadi-server.changes 2016-06-20 11:05:56.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.akonadi-server.new/akonadi-server.changes 2016-07-21 07:41:51.000000000 +0200 @@ -1,0 +2,15 @@ +Thu Jul 7 23:15:23 UTC 2016 - tittiatc...@gmail.com + +- Update to KDE Applications 16.04.3 + * KDE Applications 16.04.3 + * https://www.kde.org/announcements/announce-applications-16.04.3.php + +- Drop upstream patch fix-read-after-free-collectionstatistics.diff + +------------------------------------------------------------------- +Wed Jun 29 05:34:57 UTC 2016 - lbeltr...@kde.org + +- Add fix-read-after-free-collectionstatistics.diff: fix occasional + memory corruption (may fix kde#363881) + +------------------------------------------------------------------- Old: ---- akonadi-16.04.2.tar.xz New: ---- akonadi-16.04.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ akonadi-server.spec ++++++ --- /var/tmp/diff_new_pack.qQbzBD/_old 2016-07-21 07:41:52.000000000 +0200 +++ /var/tmp/diff_new_pack.qQbzBD/_new 2016-07-21 07:41:52.000000000 +0200 @@ -17,7 +17,7 @@ Name: akonadi-server -Version: 16.04.2 +Version: 16.04.3 Release: 0 %define rname akonadi Summary: PIM Storage Service ++++++ akonadi-16.04.2.tar.xz -> akonadi-16.04.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/autotests/libs/CMakeLists.txt new/akonadi-16.04.3/autotests/libs/CMakeLists.txt --- old/akonadi-16.04.2/autotests/libs/CMakeLists.txt 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/autotests/libs/CMakeLists.txt 2016-06-24 15:51:12.000000000 +0200 @@ -122,7 +122,7 @@ add_akonadi_isolated_test(entitycachetest.cpp) add_akonadi_isolated_test(monitortest.cpp) add_akonadi_isolated_test_advanced(monitorfiltertest.cpp "" "KF5::AkonadiPrivate") -#add_akonadi_isolated_test(searchjobtest.cpp) +add_akonadi_isolated_test(searchjobtest.cpp) add_akonadi_isolated_test(changerecordertest.cpp) add_akonadi_isolated_test(resourcetest.cpp) add_akonadi_isolated_test(subscriptiontest.cpp) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/autotests/libs/searchjobtest.cpp new/akonadi-16.04.3/autotests/libs/searchjobtest.cpp --- old/akonadi-16.04.2/autotests/libs/searchjobtest.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/autotests/libs/searchjobtest.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -19,42 +19,39 @@ */ #include "searchjobtest.h" +#include "qtest_akonadi.h" #include <collection.h> #include <collectiondeletejob.h> #include <collectionfetchjob.h> +#include <collectionmodifyjob.h> #include <searchcreatejob.h> #include <itemfetchjob.h> #include <monitor.h> #include <searchquery.h> +#include <persistentsearchattribute.h> #include "collectionutils.h" -#include <qtest_akonadi.h> - -QTEST_AKONADIMAIN(SearchJobTest, NoGUI) +QTEST_AKONADIMAIN(SearchJobTest) using namespace Akonadi; void SearchJobTest::initTestCase() { AkonadiTest::checkTestIsIsolated(); - AkonadiTest::setAllResourcesOffline(); - Akonadi::AgentInstance agent = Akonadi::AgentManager::self()->instance("akonadi_knut_resource_0"); - QVERIFY(agent.isValid()); - agent.setIsOnline(true); } void SearchJobTest::testCreateDeleteSearch() { Akonadi::SearchQuery query; - query.addTerm(Akonadi::SearchTerm("plugin", 1)); - query.addTerm(Akonadi::SearchTerm("resource", 2)); - query.addTerm(Akonadi::SearchTerm("plugin", 3)); - query.addTerm(Akonadi::SearchTerm("resource", 4)); + query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 1)); + query.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 2)); + query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 3)); + query.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 4)); // Create collection - SearchCreateJob *create = new SearchCreateJob("search123456", query, this); + SearchCreateJob *create = new SearchCreateJob(QStringLiteral("search123456"), query, this); create->setRemoteSearchEnabled(false); AKVERIFYEXEC(create); const Collection created = create->createdCollection(); @@ -63,10 +60,10 @@ // Fetch "Search" collection, check the search collection has been created CollectionFetchJob *list = new CollectionFetchJob(Collection(1), CollectionFetchJob::Recursive, this); AKVERIFYEXEC(list); - Collection::List cols = list->collections(); + const Collection::List cols = list->collections(); Collection col; - foreach (const Collection &c, cols) { - if (c.name() == "search123456") { + for (const auto &c : cols) { + if (c.name() == QLatin1String("search123456")) { col = c; } } @@ -87,12 +84,47 @@ void SearchJobTest::testModifySearch() { Akonadi::SearchQuery query; - query.addTerm(Akonadi::SearchTerm("plugin", 1)); - query.addTerm(Akonadi::SearchTerm("resource", 2)); + query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 1)); + query.addTerm(Akonadi::SearchTerm(QLatin1String("resource"), 2)); // make sure there is a virtual collection - SearchCreateJob *create = new SearchCreateJob("search123456", query, this); + SearchCreateJob *create = new SearchCreateJob(QStringLiteral("search123456"), query, this); AKVERIFYEXEC(create); Collection created = create->createdCollection(); QVERIFY(created.isValid()); + QVERIFY(created.hasAttribute<PersistentSearchAttribute>()); + + auto attr = created.attribute<PersistentSearchAttribute>(); + QVERIFY(!attr->isRecursive()); + QVERIFY(!attr->isRemoteSearchEnabled()); + QCOMPARE(attr->queryCollections(), QList<qint64>{ 0 }); + const QString oldQueryString = attr->queryString(); + + // Change the attributes + attr->setRecursive(true); + attr->setRemoteSearchEnabled(true); + attr->setQueryCollections(QList<qint64>{ 1 }); + Akonadi::SearchQuery newQuery; + newQuery.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 3)); + newQuery.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 4)); + attr->setQueryString(QString::fromUtf8(newQuery.toJSON())); + + auto modify = new CollectionModifyJob(created, this); + AKVERIFYEXEC(modify); + + auto fetch = new CollectionFetchJob(created, CollectionFetchJob::Base, this); + AKVERIFYEXEC(fetch); + QCOMPARE(fetch->collections().size(), 1); + + const auto col = fetch->collections().first(); + QVERIFY(col.hasAttribute<PersistentSearchAttribute>()); + attr = col.attribute<PersistentSearchAttribute>(); + + QVERIFY(attr->isRecursive()); + QVERIFY(attr->isRemoteSearchEnabled()); + QCOMPARE(attr->queryCollections(), QList<qint64>{ 1 }); + QVERIFY(attr->queryString() != oldQueryString); + + auto delJob = new CollectionDeleteJob(col, this); + AKVERIFYEXEC(delJob); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/core/persistentsearchattribute.cpp new/akonadi-16.04.3/src/core/persistentsearchattribute.cpp --- old/akonadi-16.04.2/src/core/persistentsearchattribute.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/core/persistentsearchattribute.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -31,7 +31,7 @@ { public: Private() - : remote(true) + : remote(false) , recursive(false) { } @@ -143,7 +143,7 @@ { QList<QByteArray> l; ImapParser::parseParenthesizedList(data, l); - for (int i = 0; i < l.size() - 1; ++i) { + for (int i = 0; i < l.size(); ++i) { const QByteArray key = l.at(i); if (key == "QUERYLANGUAGE") { // Skip the value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/handler/akappend.cpp new/akonadi-16.04.3/src/server/handler/akappend.cpp --- old/akonadi-16.04.2/src/server/handler/akappend.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/handler/akappend.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -206,8 +206,11 @@ // through from Resource during ItemSync, like $ATTACHMENT, because the // resource is not aware of them (they are usually assigned by client // upon inspecting the payload) - Q_FOREACH (const QByteArray &preserve, localFlagsToPreserve) { - flagNames.remove(preserve); + Q_FOREACH (const Flag ¤tFlag, currentItem.flags()) { + const QByteArray currentFlagName = currentFlag.name().toLatin1(); + if (localFlagsToPreserve.contains(currentFlagName)) { + flagNames.insert(currentFlagName); + } } const Flag::List flags = HandlerHelper::resolveFlags(flagNames); DataStore::self()->setItemsFlags(PimItem::List() << currentItem, flags, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/handler/modify.cpp new/akonadi-16.04.3/src/server/handler/modify.cpp --- old/akonadi-16.04.2/src/server/handler/modify.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/handler/modify.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -181,6 +181,9 @@ } changed = true; } + if (changed) { + collection.setQueryAttributes(QString::fromLatin1(queryAttributes.join(" "))); + } QStringList cols; cols.reserve(cmd.persistentSearchCollections().size()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/handler/status.cpp new/akonadi-16.04.3/src/server/handler/status.cpp --- old/akonadi-16.04.2/src/server/handler/status.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/handler/status.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -39,7 +39,7 @@ return failureResponse("No status for this folder"); } - const CollectionStatistics::Statistics &stats = CollectionStatistics::self()->statistics(col); + const CollectionStatistics::Statistics stats = CollectionStatistics::self()->statistics(col); if (stats.count == -1) { return failureResponse("Failed to query statistics."); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/handlerhelper.cpp new/akonadi-16.04.3/src/server/handlerhelper.cpp --- old/akonadi-16.04.2/src/server/handlerhelper.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/handlerhelper.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -123,7 +123,7 @@ response.setIsVirtual(col.isVirtual()); if (includeStatistics) { - const CollectionStatistics::Statistics &stats = CollectionStatistics::self()->statistics(col); + const CollectionStatistics::Statistics stats = CollectionStatistics::self()->statistics(col); if (stats.count > -1) { Protocol::FetchCollectionStatsResponse statsResponse(stats.count, stats.count - stats.read, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/storage/collectionstatistics.cpp new/akonadi-16.04.3/src/server/storage/collectionstatistics.cpp --- old/akonadi-16.04.2/src/server/storage/collectionstatistics.cpp 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/storage/collectionstatistics.cpp 2016-06-24 15:51:12.000000000 +0200 @@ -45,7 +45,7 @@ mCache.remove(col.id()); } -const CollectionStatistics::Statistics &CollectionStatistics::statistics(const Collection &col) +const CollectionStatistics::Statistics CollectionStatistics::statistics(const Collection &col) { QMutexLocker lock(&mCacheLock); auto it = mCache.find(col.id()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-16.04.2/src/server/storage/collectionstatistics.h new/akonadi-16.04.3/src/server/storage/collectionstatistics.h --- old/akonadi-16.04.2/src/server/storage/collectionstatistics.h 2016-05-31 11:33:56.000000000 +0200 +++ new/akonadi-16.04.3/src/server/storage/collectionstatistics.h 2016-06-24 15:51:12.000000000 +0200 @@ -53,7 +53,7 @@ static CollectionStatistics *self(); - const Statistics &statistics(const Collection &col); + const Statistics statistics(const Collection &col); void invalidateCollection(const Collection &col); private: