From 902a5e7aaa0ec156d19b5a7988eff1809a6a2046 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Fri, 17 Jun 2016 15:07:26 +0300 Subject: QDataStream: adjust containers' deserialization in transaction mode If an error occurs during the transaction, we should prevent the containers from being successfully read. So, check the status of the stream before reading the container, because the deserialization procedure temporarily resets it on entry. Task-number: QTBUG-54022 Change-Id: Ie955c2fa3e449374f0f8403f00e487efa2bfdaf3 Reviewed-by: Oswald Buddenhagen Reviewed-by: Edward Welbourne --- src/corelib/io/qdatastream.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/corelib/io/qdatastream.h') diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index 260dd519e3..e8634fddef 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -63,6 +63,9 @@ template class QMap; #if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED) class QDataStreamPrivate; +namespace QtPrivate { +class StreamStateSaver; +} class Q_CORE_EXPORT QDataStream { public: @@ -192,6 +195,7 @@ private: Status q_status; int readBlock(char *data, int len); + friend class QtPrivate::StreamStateSaver; }; namespace QtPrivate { @@ -201,7 +205,8 @@ class StreamStateSaver public: inline StreamStateSaver(QDataStream *s) : stream(s), oldStatus(s->status()) { - stream->resetStatus(); + if (!stream->dev || !stream->dev->isTransactionStarted()) + stream->resetStatus(); } inline ~StreamStateSaver() { -- cgit v1.2.3