summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2020-11-11 12:50:54 -0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-12-08 02:39:20 +0000
commit3caacb2f2bbd3947f79d9351b7c9af4517271875 (patch)
treed1243c75b87728793f61134abb1357dbb91e3a30 /tests/auto
parent15abeed11687dc19afdc73e7c54c0f87da4286ba (diff)
QCborStreamReader: avoid allocating result if data is insufficient
By calling the internal readStringChunk() function with a QByteArray pointer, QCborStreamReader::readByteArray() can now avoid allocating the resulting buffer until the internals have confirmed that there is sufficient data in the incoming buffer. As a result, we first detect the EOF condition before we conclude the payload would have been too big for QByteArray (validation()) test. Meanwhile, the hugeDeviceValidation() test ends up with a few conditions where it would have copied 1 GB of data, so limit that too. We make a choice of reporting OOM vs DataTooLarge only if QByteArray fails to allocate in the first place (QByteArray::resize() -> Q_CHECK_PTR -> qBadAlloc, QtCore is always built with exceptions on). The QCborValue unit test needed a temporary work around until we apply the same allocation fix (see next commit). Fixes: QTBUG-88253 Change-Id: I7b9b97ae9b32412abdc6fffd164523eeae49cdfe Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> (cherry picked from commit 9a55f40937d037d06e00b09465d8dad0554692fc) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/corelib/serialization/cborlargedatavalidation.cpp14
-rw-r--r--tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp5
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp2
3 files changed, 13 insertions, 8 deletions
diff --git a/tests/auto/corelib/serialization/cborlargedatavalidation.cpp b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp
index b1de0e1a54..64191db1ef 100644
--- a/tests/auto/corelib/serialization/cborlargedatavalidation.cpp
+++ b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp
@@ -67,7 +67,7 @@ qint64 LargeIODevice::readData(char *data, qint64 maxlen)
qint64 p = pos();
if (maxlen > realSize - p)
maxlen = realSize - p;
- memset(data, '\0', maxlen);
+ memset(data, '\0', qMin(maxlen, qint64(32 * 1024)));
qint64 fromstart = start.size() - p;
if (fromstart > maxlen)
@@ -88,24 +88,24 @@ void addValidationLargeData(qsizetype minInvalid, qsizetype maxInvalid)
qToBigEndian(v, toolong + 1);
QTest::addRow("bytearray-too-big-for-qbytearray-%llx", v)
- << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge;
+ << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorUnexpectedEOF;
QTest::addRow("bytearray-chunked-too-big-for-qbytearray-%llx", v)
<< ('\x5f' + QByteArray(toolong, sizeof(toolong)) + '\xff')
- << 0 << CborErrorDataTooLarge;
+ << 0 << CborErrorUnexpectedEOF;
QTest::addRow("bytearray-2chunked-too-big-for-qbytearray-%llx", v)
<< ("\x5f\x40" + QByteArray(toolong, sizeof(toolong)) + '\xff')
- << 0 << CborErrorDataTooLarge;
+ << 0 << CborErrorUnexpectedEOF;
toolong[0] |= 0x20;
// QCborStreamReader::readString copies to a QByteArray first
QTest::addRow("string-too-big-for-qbytearray-%llx", v)
- << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge;
+ << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorUnexpectedEOF;
QTest::addRow("string-chunked-too-big-for-qbytearray-%llx", v)
<< ('\x7f' + QByteArray(toolong, sizeof(toolong)) + '\xff')
- << 0 << CborErrorDataTooLarge;
+ << 0 << CborErrorUnexpectedEOF;
QTest::addRow("string-2chunked-too-big-for-qbytearray-%llx", v)
<< ("\x7f\x60" + QByteArray(toolong, sizeof(toolong)) + '\xff')
- << 0 << CborErrorDataTooLarge;
+ << 0 << CborErrorUnexpectedEOF;
}
}
diff --git a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
index e73b863989..437d8c40ce 100644
--- a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
+++ b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
@@ -297,7 +297,10 @@ void tst_QCborStreamReader::integers()
void escapedAppendTo(QString &result, const QByteArray &data)
{
- result += "h'" + QString::fromLatin1(data.toHex()) + '\'';
+ QByteArray hex =
+ data.size() < 512*1024 ? data.toHex() :
+ "data of size " + QByteArray::number(data.size());
+ result += "h'" + QString::fromLatin1(hex) + '\'';
}
void escapedAppendTo(QString &result, const QString &data)
diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
index e3be6d3fab..64d4451f08 100644
--- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
+++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
@@ -2042,6 +2042,7 @@ void tst_QCborValue::validation()
QCborParserError parserError;
QCborValue decoded = QCborValue::fromCbor(data, &parserError);
+ if (parserError.error != QCborError::DataTooLarge) // ### temporary!!
QCOMPARE(parserError.error, error);
if (data.startsWith('\x81')) {
@@ -2049,6 +2050,7 @@ void tst_QCborValue::validation()
char *ptr = const_cast<char *>(data.constData());
QByteArray mid = QByteArray::fromRawData(ptr + 1, data.size() - 1);
decoded = QCborValue::fromCbor(mid, &parserError);
+ if (parserError.error != QCborError::DataTooLarge) // ### temporary!!
QCOMPARE(parserError.error, error);
}
}