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 &currentFlag, 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:


Reply via email to