mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-12-27 08:19:30 +08:00
Fix wrong comparison result
The QString::toInt() might overflow when the string is long. Closes #10706.
This commit is contained in:
parent
4df1bca8bb
commit
36cf689432
@ -96,18 +96,29 @@ namespace
|
||||
}
|
||||
else if (leftChar.isDigit() && rightChar.isDigit()) {
|
||||
// Both are digits, compare the numbers
|
||||
const auto consumeNumber = [](const QString &str, int &pos) -> int
|
||||
|
||||
const auto numberView = [](const QString &str, int &pos) -> QStringRef
|
||||
{
|
||||
const int start = pos;
|
||||
while ((pos < str.size()) && str[pos].isDigit())
|
||||
++pos;
|
||||
return str.midRef(start, (pos - start)).toInt();
|
||||
return str.midRef(start, (pos - start));
|
||||
};
|
||||
|
||||
const int numL = consumeNumber(left, posL);
|
||||
const int numR = consumeNumber(right, posR);
|
||||
if (numL != numR)
|
||||
return (numL - numR);
|
||||
const QStringRef numViewL = numberView(left, posL);
|
||||
const QStringRef numViewR = numberView(right, posR);
|
||||
|
||||
if (numViewL.length() != numViewR.length())
|
||||
return (numViewL.length() - numViewR.length());
|
||||
|
||||
// both string/view has the same length
|
||||
for (int i = 0; i < numViewL.length(); ++i) {
|
||||
const QChar numL = numViewL[i];
|
||||
const QChar numR = numViewR[i];
|
||||
|
||||
if (numL != numR)
|
||||
return (numL.unicode() - numR.unicode());
|
||||
}
|
||||
|
||||
// String + digits do match and we haven't hit the end of both strings
|
||||
// then continue to consume the remainings
|
||||
|
Loading…
Reference in New Issue
Block a user