summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qversionnumber.cpp8
-rw-r--r--tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp17
2 files changed, 21 insertions, 4 deletions
diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp
index 933f7fa6b3..4d148249c0 100644
--- a/src/corelib/tools/qversionnumber.cpp
+++ b/src/corelib/tools/qversionnumber.cpp
@@ -54,6 +54,7 @@
#endif
#include <algorithm>
+#include <limits>
QT_BEGIN_NAMESPACE
@@ -390,14 +391,13 @@ QVersionNumber QVersionNumber::fromString(const QString &string, int *suffixInde
const char *end = start;
const char *lastGoodEnd = start;
const char *endOfString = cString.constData() + cString.size();
- int value;
do {
bool ok = false;
- value = int(qstrtoull(start, &end, 10, &ok));
- if (!ok)
+ const qulonglong value = qstrtoull(start, &end, 10, &ok);
+ if (!ok || value > qulonglong(std::numeric_limits<int>::max()))
break;
- seg.append(value);
+ seg.append(int(value));
start = end + 1;
lastGoodEnd = end;
} while (start < endOfString && (end < endOfString && *end == '.'));
diff --git a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
index a43bb3ee68..f2df2271d9 100644
--- a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
+++ b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
@@ -435,6 +435,23 @@ void tst_QVersionNumber::assignment()
void tst_QVersionNumber::fromString_data()
{
singleInstanceData();
+
+ const quint64 largerThanIntCanHold = quint64(std::numeric_limits<int>::max()) + 1;
+ const QString largerThanIntCanHoldString0 = QString::number(largerThanIntCanHold) + ".0";
+ const QString largerThanIntCanHoldString1 = "0." + QString::number(largerThanIntCanHold);
+
+ QTest::newRow(qPrintable(largerThanIntCanHoldString0))
+ << QVector<int>() << QVersionNumber() << QString() << largerThanIntCanHoldString0 << 0 << true;
+ QTest::newRow(qPrintable(largerThanIntCanHoldString1))
+ << QVector<int>(0) << QVersionNumber(0) << QStringLiteral("0") << largerThanIntCanHoldString1 << 1 << true;
+
+ const QString largerThanULongLongCanHoldString0 = QString::number(std::numeric_limits<qulonglong>::max()) + "0.0"; // 10x ULLONG_MAX
+ const QString largerThanULongLongCanHoldString1 = "0." + QString::number(std::numeric_limits<qulonglong>::max()) + '0'; // 10x ULLONG_MAX
+
+ QTest::newRow(qPrintable(largerThanULongLongCanHoldString0))
+ << QVector<int>() << QVersionNumber() << QString() << largerThanULongLongCanHoldString0 << 0 << true;
+ QTest::newRow(qPrintable(largerThanULongLongCanHoldString1))
+ << QVector<int>(0) << QVersionNumber(0) << QStringLiteral("0") << largerThanULongLongCanHoldString1 << 1 << true;
}
void tst_QVersionNumber::fromString()