]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix sorting issue when sorting by "size"
authorPeter Penz <peter.penz19@gmail.com>
Thu, 2 Feb 2012 14:58:42 +0000 (15:58 +0100)
committerPeter Penz <peter.penz19@gmail.com>
Thu, 2 Feb 2012 15:03:15 +0000 (16:03 +0100)
Root cause of the issue was an overflow in:
result = a - b;
where result is 'int' and a and b are 'KIO::filesize_t'.

BUG: 293086
FIXED-IN: 4.8.1

src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h

index d64954698e53a0f48c9cc50c6797b59a15f2fb47..95c960b3da1a70b55a74a00d17faa5f4051857e9 100644 (file)
@@ -1301,21 +1301,24 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const
         
     case SizeRole: {
         if (itemA.isDir()) {
-            Q_ASSERT(itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above
+            // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan():
+            Q_ASSERT(itemB.isDir());
 
             const QVariant valueA = a->values.value("size");
             const QVariant valueB = b->values.value("size");
-
-            if (valueA.isNull()) {
+            if (valueA.isNull() && valueB.isNull()) {
+                result = 0;
+            } else if (valueA.isNull()) {
                 result = -1;
             } else if (valueB.isNull()) {
                 result = +1;
             } else {
-                result = valueA.value<KIO::filesize_t>() - valueB.value<KIO::filesize_t>();
+                result = fileSizeCompare(valueA.value<KIO::filesize_t>(), valueB.value<KIO::filesize_t>());
             }
         } else {
-            Q_ASSERT(!itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above
-            result = itemA.size() - itemB.size();
+            // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan():
+            Q_ASSERT(!itemB.isDir());
+            result = fileSizeCompare(itemA.size(), itemB.size());
         }
         break;
     }
@@ -1940,4 +1943,15 @@ KFileItemList KFileItemModel::childItems(const KFileItem& item) const
     return items;
 }
 
+int KFileItemModel::fileSizeCompare(KIO::filesize_t a, KIO::filesize_t b)
+{
+    if (a > b) {
+        return +1;
+    } else if (a < b) {
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
 #include "kfileitemmodel.moc"
index ff816c85ca0e5ce5835b427df9424cc8d6a4fc6b..d819c373496f84dea19993362a63ae14e94a68bb 100644 (file)
@@ -330,6 +330,12 @@ private:
      */
     KFileItemList childItems(const KFileItem& item) const;
 
+    /**
+     * Helper method for sortRoleCompare().
+     * @return 0 if both sizes are equal, +1 if a > b and -1 if a < b.
+     */
+    static int fileSizeCompare(KIO::filesize_t a, KIO::filesize_t b);
+
 private:
     QWeakPointer<KDirLister> m_dirLister;