From c46ee7df57c30c94107df8506d30d8872ffa3baa Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Wed, 25 May 2022 09:07:37 +0200 Subject: QStringConverter: Do not crash if invalid Attempting to use an invalid QStringConverter would so far have resulted in a crash, as we would dereference the null iface pointer. Fix this by inserting adequate checks, and ensure that hasError returns true if we attempt to en/decode with an invalid converter. Pick-to: 6.2 6.3 Change-Id: Icf74bb88cd8c95685481cc0bd512da99b62f33e6 Reviewed-by: Lars Knoll --- .../text/qstringconverter/tst_qstringconverter.cpp | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'tests/auto/corelib') diff --git a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp index 6fe20b1453..231df0390e 100644 --- a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp +++ b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp @@ -120,6 +120,8 @@ private slots: void constructByName(); + void invalidConverter(); + void convertUtf8_data(); void convertUtf8(); void convertUtf8CharByChar_data() { convertUtf8_data(); } @@ -181,6 +183,60 @@ void tst_QStringConverter::constructByName() QVERIFY(!strcmp(decoder.name(), "UTF-16")); } +void tst_QStringConverter::invalidConverter() +{ + // QStringEncoder tests + { + QStringEncoder encoder; + QVERIFY(!encoder.isValid()); + QVERIFY(!encoder.name()); + QByteArray encoded = encoder(u"Some text"); + QVERIFY(encoded.isEmpty()); + QVERIFY(encoder.hasError()); + + encoder.resetState(); + QVERIFY(!encoder.hasError()); + + encoded = encoder.encode(u"More text"); + QVERIFY(encoded.isEmpty()); + QVERIFY(encoder.hasError()); + QCOMPARE(encoder.requiredSpace(42), 0); + + encoder.resetState(); + QVERIFY(!encoder.hasError()); + char buffer[100]; + char *position = encoder.appendToBuffer(buffer, u"Even more"); + QCOMPARE(position, buffer); + QVERIFY(encoder.hasError()); + } + + // QStringDecoder tests + { + QStringDecoder decoder; + QVERIFY(!decoder.name()); + QVERIFY(!decoder.isValid()); + QString decoded = decoder("Some text"); + QVERIFY(decoded.isEmpty()); + QVERIFY(decoder.hasError()); + + decoder.resetState(); + QVERIFY(!decoder.hasError()); + + decoded = decoder.decode("More text"); + QVERIFY(decoded.isEmpty()); + QVERIFY(decoder.hasError()); + + QCOMPARE(decoder.requiredSpace(42), 0); + + decoder.resetState(); + QVERIFY(!decoder.hasError()); + QChar buffer[100]; + QChar *position = decoder.appendToBuffer(buffer, "Even more"); + QCOMPARE(position, buffer); + QVERIFY(decoder.hasError()); + } +} + void tst_QStringConverter::convertUtf8_data() { QTest::addColumn("encoding"); -- cgit v1.2.3