From: Peter Penz Date: Thu, 2 Feb 2012 14:58:42 +0000 (+0100) Subject: Fix sorting issue when sorting by "size" X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/452c8b8ec8b18e62ff4bae0e49e3f5002ae2f301 Fix sorting issue when sorting by "size" 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 --- diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index d64954698..95c960b3d 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -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() - valueB.value(); + result = fileSizeCompare(valueA.value(), valueB.value()); } } 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" diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index ff816c85c..d819c3734 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -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 m_dirLister;