summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/serialization/qdatastream.cpp4
-rw-r--r--src/corelib/serialization/qdatastream.h26
2 files changed, 18 insertions, 12 deletions
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index 7c4c5cc12af..d0421f70fad 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -1397,8 +1397,8 @@ QDataStream &QDataStream::writeBytes(const char *s, qint64 len)
return *this;
}
CHECK_STREAM_WRITE_PRECOND(*this)
- writeQSizeType(*this, len); // write length specifier
- if (len > 0)
+ // Write length then, if any, content
+ if (writeQSizeType(*this, len) && len > 0)
writeRawData(s, len);
return *this;
}
diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h
index 24c5b87ee00..217bdab7d34 100644
--- a/src/corelib/serialization/qdatastream.h
+++ b/src/corelib/serialization/qdatastream.h
@@ -212,7 +212,7 @@ private:
#endif
qint64 readBlock(char *data, qint64 len);
static inline qint64 readQSizeType(QDataStream &s);
- static inline void writeQSizeType(QDataStream &s, qint64 value);
+ static inline bool writeQSizeType(QDataStream &s, qint64 value);
enum class QDataStreamSizes : quint32 { NullCode = 0xffffffffu, ExtendedSize = 0xfffffffeu };
friend class QtPrivate::StreamStateSaver;
@@ -339,7 +339,8 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
template <typename Container>
QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
{
- QDataStream::writeQSizeType(s, c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
for (const typename Container::value_type &t : c)
s << t;
@@ -349,7 +350,8 @@ QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
template <typename Container>
QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
{
- QDataStream::writeQSizeType(s, c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
auto it = c.constBegin();
auto end = c.constEnd();
while (it != end) {
@@ -363,7 +365,8 @@ QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
template <typename Container>
QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c)
{
- QDataStream::writeQSizeType(s, c.size());
+ if (!QDataStream::writeQSizeType(s, c.size()))
+ return s;
auto it = c.constBegin();
auto end = c.constEnd();
while (it != end) {
@@ -425,16 +428,19 @@ qint64 QDataStream::readQSizeType(QDataStream &s)
return extendedLen;
}
-void QDataStream::writeQSizeType(QDataStream &s, qint64 value)
+bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
{
- if (value < qint64(QDataStreamSizes::ExtendedSize))
+ if (value < qint64(QDataStreamSizes::ExtendedSize)) {
s << quint32(value);
- else if (s.version() >= QDataStream::Qt_6_7)
+ } else if (s.version() >= QDataStream::Qt_6_7) {
s << quint32(QDataStreamSizes::ExtendedSize) << value;
- else if (value == qint64(QDataStreamSizes::ExtendedSize))
+ } else if (value == qint64(QDataStreamSizes::ExtendedSize)) {
s << quint32(QDataStreamSizes::ExtendedSize);
- else
- s.setStatus(QDataStream::WriteFailed); // value is too big for old format
+ } else {
+ s.setStatus(QDataStream::SizeLimitExceeded); // value is too big for old format
+ return false;
+ }
+ return true;
}
inline QDataStream &QDataStream::operator>>(char &i)