diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp index 171d29f529c..008edc088a0 100644 --- a/src/corelib/serialization/qdatastream.cpp +++ b/src/corelib/serialization/qdatastream.cpp @@ -222,6 +222,11 @@ QT_BEGIN_NAMESPACE data in the underlying device. \value ReadCorruptData The data stream has read corrupt data. \value WriteFailed The data stream cannot write to the underlying device. + \value [since 6.7] SizeLimitExceeded The data stream cannot read or write + the data because its size is larger than supported + by the current platform. This can happen, for + example, when trying to read more that 2 GiB of + data on a 32-bit platform. */ /***************************************************************************** @@ -1064,7 +1069,7 @@ QDataStream &QDataStream::readBytes(char *&s, qsizetype &l) qsizetype len = qsizetype(length); if (length != len || length < 0) { - setStatus(ReadCorruptData); // Cannot store len in l + setStatus(SizeLimitExceeded); // Cannot store len in l return *this; } diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h index 80fd2715961..90d7c9d9da2 100644 --- a/src/corelib/serialization/qdatastream.h +++ b/src/corelib/serialization/qdatastream.h @@ -101,7 +101,8 @@ public: Ok, ReadPastEnd, ReadCorruptData, - WriteFailed + WriteFailed, + SizeLimitExceeded, }; enum FloatingPointPrecision { @@ -267,7 +268,7 @@ QDataStream &readArrayBasedContainer(QDataStream &s, Container &c) qint64 size = QDataStream::readQSizeType(s); qsizetype n = size; if (size != n || size < 0) { - s.setStatus(QDataStream::ReadCorruptData); + s.setStatus(QDataStream::SizeLimitExceeded); return s; } c.reserve(n); @@ -293,7 +294,7 @@ QDataStream &readListBasedContainer(QDataStream &s, Container &c) qint64 size = QDataStream::readQSizeType(s); qsizetype n = size; if (size != n || size < 0) { - s.setStatus(QDataStream::ReadCorruptData); + s.setStatus(QDataStream::SizeLimitExceeded); return s; } for (qsizetype i = 0; i < n; ++i) { @@ -318,7 +319,7 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c) qint64 size = QDataStream::readQSizeType(s); qsizetype n = size; if (size != n || size < 0) { - s.setStatus(QDataStream::ReadCorruptData); + s.setStatus(QDataStream::SizeLimitExceeded); return s; } for (qsizetype i = 0; i < n; ++i) { diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 69d21cbe24d..e48b9bcac1e 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -3312,7 +3312,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba) qsizetype len = size; if (size != len || size < -1) { ba.clear(); - in.setStatus(QDataStream::ReadCorruptData); + in.setStatus(QDataStream::SizeLimitExceeded); return in; } if (len == -1) { // null byte-array diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 5dceb2c3e31..aa07223860f 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -9375,7 +9375,7 @@ QDataStream &operator>>(QDataStream &in, QString &str) qsizetype bytes = size; if (size != bytes || size < -1) { str.clear(); - in.setStatus(QDataStream::ReadCorruptData); + in.setStatus(QDataStream::SizeLimitExceeded); return in; } if (bytes == -1) { // null string diff --git a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp index 22bcba5ef13..8051924dcec 100644 --- a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp +++ b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp @@ -2904,10 +2904,10 @@ void tst_QDataStream::status_QString_data() QTest::newRow("32 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfc", 4) << (int) QDataStream::ReadPastEnd << QString(); #else // too big for 32 bit platforms - QTest::newRow("32 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfc", 4) << (int) QDataStream::ReadCorruptData << QString(); + QTest::newRow("32 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfc", 4) << (int) QDataStream::SizeLimitExceeded << QString(); #endif // too big on both 32 and 64 bit platforms because qsizetype is signed - QTest::newRow("64 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xfe", 12) << (int) QDataStream::ReadCorruptData << QString(); + QTest::newRow("64 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xfe", 12) << (int) QDataStream::SizeLimitExceeded << QString(); // corrupt data because QChar is 16 bit => even size required QTest::newRow("corrupt1") << QByteArray("yyyy") << (int) QDataStream::ReadCorruptData << QString();