QXmlStreamWriter: fix attempts to write bad QStrings

We weren't doing the decoding from UTF-16 to UTF-32, so weren't catching
invalid code sequences

[ChangeLog][QtCore][QXmlStreamWriter] The class now rejects writing
UTF-8 and UTF-16 invalid input (improper code unit sequences).

Task-number: QTBUG-122241
Pick-to: 6.6 6.5
Change-Id: I83dda2d36c904517b3c0fffd17b42d17c637fdc4
Reviewed-by: Mate Barany <mate.barany@qt.io>
(cherry picked from commit c25541e9ac4c7021c69c600906e5ca8c80f18401)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Thiago Macieira 2024-02-15 15:28:58 -08:00 committed by Qt Cherry-pick Bot
parent 6bef40cb82
commit bdb713b1b7
2 changed files with 26 additions and 2 deletions

View File

@ -22,6 +22,7 @@
#include "qxmlstream_p.h"
#include "qxmlstreamparser_p.h"
#include <private/qstringconverter_p.h>
#include <private/qstringiterator_p.h>
QT_BEGIN_NAMESPACE
@ -2971,9 +2972,12 @@ void QXmlStreamWriterPrivate::writeEscaped(QAnyStringView s, bool escapeWhitespa
}
};
struct NextUtf16 {
char32_t operator()(const QChar *&it, const QChar *) const
char32_t operator()(const QChar *&it, const QChar *end) const
{
return (it++)->unicode();
QStringIterator decoder(it, end);
char32_t result = decoder.next(u'\0');
it = decoder.position();
return result;
}
};

View File

@ -576,6 +576,8 @@ private slots:
void writeAttribute() const;
void writeBadCharactersUtf8_data() const;
void writeBadCharactersUtf8() const;
void writeBadCharactersUtf16_data() const;
void writeBadCharactersUtf16() const;
void entitiesAndWhitespace_1() const;
void entitiesAndWhitespace_2() const;
void testFalsePrematureError() const;
@ -1505,6 +1507,24 @@ void tst_QXmlStream::writeBadCharactersUtf8() const
QVERIFY(writer.hasError());
}
void tst_QXmlStream::writeBadCharactersUtf16_data() const
{
QTest::addColumn<QString>("input");
QTest::addRow("low-surrogate") << u"\xdc00"_s;
QTest::addRow("high-surrogate") << u"\xd800"_s;
QTest::addRow("inverted-surrogate-pair") << u"\xdc00\xd800"_s;
QTest::addRow("high-surrogate+non-surrogate") << u"\xd800z"_s;
}
void tst_QXmlStream::writeBadCharactersUtf16() const
{
QFETCH(QString, input);
QString target;
QXmlStreamWriter writer(&target);
writer.writeTextElement("a", input);
QVERIFY(writer.hasError());
}
void tst_QXmlStream::entitiesAndWhitespace_1() const
{
QXmlStreamReader reader(QLatin1String("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"><test>&extEnt;</test>"));