diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2016-06-14 18:51:02 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-06-15 07:43:54 +0000 |
commit | 3c87c82e52055bcd6216ccd622ae20ce528433f5 (patch) | |
tree | fbd25f396b15f1520c749871631f04105f1a76bc /src/corelib | |
parent | 49491dd678071661db2e34133c051cb176a83e0b (diff) |
QDataStream: do not lose error status while reading containers
Otherwise, the code:
ds >> s >> hash;
could set the stream status to ReadPastEnd, while deserialization
of the string is failed with ReadCorruptData status.
Proposed solution is to restore a previously latched error status
unconditionally in accordance with QDataStream::setStatus() docs.
Change-Id: Id3a7dccf709b02e5b018efb48d7647ee48fe5124
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/io/qdatastream.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index e4cd3b3509..e0a9cccdad 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -363,8 +363,10 @@ Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QHash<Key, T> &has if (in.status() != QDataStream::Ok) hash.clear(); - if (oldStatus != QDataStream::Ok) + if (oldStatus != QDataStream::Ok) { + in.resetStatus(); in.setStatus(oldStatus); + } return in; } @@ -407,8 +409,10 @@ Q_OUTOFLINE_TEMPLATE QDataStream &operator>>(QDataStream &in, QMap<aKey, aT> &ma } if (in.status() != QDataStream::Ok) map.clear(); - if (oldStatus != QDataStream::Ok) + if (oldStatus != QDataStream::Ok) { + in.resetStatus(); in.setStatus(oldStatus); + } return in; } |