diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp | 14 | ||||
-rw-r--r-- | tests/auto/network/access/qdecompresshelper/10K.gz | bin | 0 -> 55 bytes | |||
-rw-r--r-- | tests/auto/network/access/qdecompresshelper/tst_qdecompresshelper.cpp | 40 |
3 files changed, 53 insertions, 1 deletions
diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 00ed82ee2d..c2f4e82896 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -591,10 +591,22 @@ void tst_QDateTime::setMSecsSinceEpoch_data() << Q_INT64_C(0) << QDateTime(QDate(1970, 1, 1), QTime(0, 0), Qt::UTC) << QDateTime(QDate(1970, 1, 1), QTime(1, 0)); - QTest::newRow("-1") + QTest::newRow("+1ms") + << Q_INT64_C(+1) + << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0, 1), Qt::UTC) + << QDateTime(QDate(1970, 1, 1), QTime(1, 0, 0, 1)); + QTest::newRow("+1s") + << Q_INT64_C(+1000) + << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 1), Qt::UTC) + << QDateTime(QDate(1970, 1, 1), QTime(1, 0, 1)); + QTest::newRow("-1ms") << Q_INT64_C(-1) << QDateTime(QDate(1969, 12, 31), QTime(23, 59, 59, 999), Qt::UTC) << QDateTime(QDate(1970, 1, 1), QTime(0, 59, 59, 999)); + QTest::newRow("-1s") + << Q_INT64_C(-1000) + << QDateTime(QDate(1969, 12, 31), QTime(23, 59, 59), Qt::UTC) + << QDateTime(QDate(1970, 1, 1), QTime(0, 59, 59)); QTest::newRow("123456789") << Q_INT64_C(123456789) << QDateTime(QDate(1970, 1, 2), QTime(10, 17, 36, 789), Qt::UTC) diff --git a/tests/auto/network/access/qdecompresshelper/10K.gz b/tests/auto/network/access/qdecompresshelper/10K.gz Binary files differnew file mode 100644 index 0000000000..c5c4959763 --- /dev/null +++ b/tests/auto/network/access/qdecompresshelper/10K.gz diff --git a/tests/auto/network/access/qdecompresshelper/tst_qdecompresshelper.cpp b/tests/auto/network/access/qdecompresshelper/tst_qdecompresshelper.cpp index c31ab294cc..cfeff188f4 100644 --- a/tests/auto/network/access/qdecompresshelper/tst_qdecompresshelper.cpp +++ b/tests/auto/network/access/qdecompresshelper/tst_qdecompresshelper.cpp @@ -64,6 +64,9 @@ private Q_SLOTS: void decompressBigData_data(); void decompressBigData(); + void archiveBomb_data(); + void archiveBomb(); + #if QT_POINTER_SIZE >= 8 void bigZlib(); #endif @@ -392,6 +395,43 @@ void tst_QDecompressHelper::decompressBigData() QTEST(totalSize, "size"); } +void tst_QDecompressHelper::archiveBomb_data() +{ + QTest::addColumn<QByteArray>("encoding"); + QTest::addColumn<QString>("path"); + QTest::addColumn<bool>("shouldFail"); + + QTest::newRow("gzip-10K") << QByteArray("gzip") << (srcDir + "/10K.gz") << false; + QTest::newRow("gzip-4G") << QByteArray("gzip") << QString(":/4G.gz") << true; +} + +void tst_QDecompressHelper::archiveBomb() +{ + QFETCH(bool, shouldFail); + QFETCH(QString, path); + QFile file(path); + QVERIFY(file.open(QIODevice::ReadOnly)); + + QDecompressHelper helper; + QFETCH(QByteArray, encoding); + helper.setEncoding(encoding); + QVERIFY(helper.isValid()); + + constexpr qint64 SafeSizeLimit = 10 * 1024 * 1024; + constexpr qint64 RatioLimit = 40; + qint64 bytesToRead = std::min(SafeSizeLimit / RatioLimit, file.bytesAvailable()); + QByteArray output(1 + bytesToRead * RatioLimit, Qt::Uninitialized); + helper.feed(file.read(bytesToRead)); + qsizetype bytesRead = helper.read(output.data(), output.size()); + QVERIFY(bytesRead <= output.size()); + QVERIFY(helper.isValid()); + + if (shouldFail) + QCOMPARE(bytesRead, -1); + else + QVERIFY(bytesRead > 0); +} + #if QT_POINTER_SIZE >= 8 void tst_QDecompressHelper::bigZlib() { |