diff options
-rw-r--r-- | src/corelib/tools/qversionnumber.cpp | 8 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp | 17 |
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() |