diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index e68544b1cf5..b32d32c1a41 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -3069,13 +3069,11 @@ void QXmlStreamWriterPrivate::doWriteToDevice(QStringView s) while (!s.isEmpty()) { const qsizetype chunkSize = std::min(s.size(), MaxChunkSize); char *end = QUtf8::convertFromUnicode(buffer, s.first(chunkSize), &state); - if (state.remainingChars > 0) { - hasEncodingError = true; - return; - } doWriteToDevice(QUtf8StringView{buffer, end}); s = s.sliced(chunkSize); } + if (state.remainingChars > 0) + hasEncodingError = true; } void QXmlStreamWriterPrivate::doWriteToDevice(QUtf8StringView s) diff --git a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp index b91182d3097..a91a9bc752f 100644 --- a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp +++ b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp @@ -1695,16 +1695,23 @@ void tst_QXmlStream::readBack() const { QFETCH(const int, plane); + constexpr qsizetype MaxChunkSizeWhenEncoding = 512; // from qxmlstream.cpp QBuffer buffer; + QString text = QString(513, 'a'); // one longer than the internal conversion buffer for (char16_t i = 0; i < (std::numeric_limits::max)(); ++i) { const char32_t c = (plane << 16) + i; + // end chunk in invalid character, split surrogates: + const auto pair = QChar::fromUcs4(c); + text.resize(MaxChunkSizeWhenEncoding + 1 - pair.size()); + text += pair; + QVERIFY(buffer.open(QIODevice::WriteOnly|QIODevice::Truncate)); QXmlStreamWriter writer(&buffer); writer.writeStartDocument(); - writer.writeTextElement("a", c); + writer.writeTextElement("a", text); writer.writeEndDocument(); buffer.close();