- Add upstream security fix (CVE-2024-33861):
* 0001-QStringConverterICU-Pass-correct-pointer-to-callback.patch OBS-URL: https://build.opensuse.org/package/show/KDE:Qt6/qt6-base?expand=0&rev=106
This commit is contained in:
parent
db71d68699
commit
af544a6f07
166
0001-QStringConverterICU-Pass-correct-pointer-to-callback.patch
Normal file
166
0001-QStringConverterICU-Pass-correct-pointer-to-callback.patch
Normal file
@ -0,0 +1,166 @@
|
||||
From 7c4e1357e49baebdd2d20710fccb5604cbb36c0d Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Kosmale <fabian.kosmale@qt.io>
|
||||
Date: Thu, 18 Apr 2024 10:25:21 +0200
|
||||
Subject: [PATCH] QStringConverterICU: Pass correct pointer to callback
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Pass the pointer to the current state, not a pointer to a pointer to it.
|
||||
|
||||
[ChangeLog][QtCore][QStringConverter] Fixed a bug involving moved
|
||||
QStringEncoder/QStringDecoder objects accessing invalid state.
|
||||
|
||||
Amends 122270d6bea164e6df4357f4d4d77aacfa430470.
|
||||
|
||||
Done-with: Marc Mutz <marc.mutz@qt.io>
|
||||
Pick-to: 6.5
|
||||
Change-Id: I70d4dc00e3e0db6cad964579662bcf6d185a4c34
|
||||
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
|
||||
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
|
||||
(cherry picked from commit 39bbfce9b675c9085ef49c9b9c52c146eca55e4a)
|
||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||
---
|
||||
src/corelib/text/qstringconverter.cpp | 4 +-
|
||||
.../qstringconverter/tst_qstringconverter.cpp | 72 +++++++++++--------
|
||||
2 files changed, 44 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
|
||||
index b574984391..fd45ccf2fd 100644
|
||||
--- a/src/corelib/text/qstringconverter.cpp
|
||||
+++ b/src/corelib/text/qstringconverter.cpp
|
||||
@@ -1954,7 +1954,7 @@ struct QStringConverterICU : QStringConverter
|
||||
const void *context;
|
||||
ucnv_getToUCallBack(icu_conv, &action, &context);
|
||||
if (context != state)
|
||||
- ucnv_setToUCallBack(icu_conv, action, &state, nullptr, nullptr, &err);
|
||||
+ ucnv_setToUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
|
||||
|
||||
ucnv_toUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
|
||||
// We did reserve enough space:
|
||||
@@ -1987,7 +1987,7 @@ struct QStringConverterICU : QStringConverter
|
||||
const void *context;
|
||||
ucnv_getFromUCallBack(icu_conv, &action, &context);
|
||||
if (context != state)
|
||||
- ucnv_setFromUCallBack(icu_conv, action, &state, nullptr, nullptr, &err);
|
||||
+ ucnv_setFromUCallBack(icu_conv, action, state, nullptr, nullptr, &err);
|
||||
|
||||
ucnv_fromUnicode(icu_conv, &target, targetLimit, &source, sourceLimit, nullptr, flush, &err);
|
||||
// We did reserve enough space:
|
||||
diff --git a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
|
||||
index d5fff83321..cd4bd8d1b6 100644
|
||||
--- a/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
|
||||
+++ b/tests/auto/corelib/text/qstringconverter/tst_qstringconverter.cpp
|
||||
@@ -571,11 +571,10 @@ void tst_QStringConverter::charByCharConsistency_data()
|
||||
|
||||
void tst_QStringConverter::charByCharConsistency()
|
||||
{
|
||||
- QFETCH(QStringView, source);
|
||||
- QFETCH(QByteArray, codec);
|
||||
+ QFETCH(const QStringView, source);
|
||||
+ QFETCH(const QByteArray, codec);
|
||||
|
||||
- {
|
||||
- QStringEncoder encoder(codec);
|
||||
+ const auto check = [&](QStringEncoder encoder){
|
||||
if (!encoder.isValid())
|
||||
QSKIP("Unsupported codec");
|
||||
|
||||
@@ -586,19 +585,28 @@ void tst_QStringConverter::charByCharConsistency()
|
||||
stepByStepConverted += encoder.encode(codeUnit);
|
||||
}
|
||||
QCOMPARE(stepByStepConverted, fullyConverted);
|
||||
- }
|
||||
+ };
|
||||
+
|
||||
+ check(QStringEncoder(codec));
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
+ check(QStringEncoder(codec, QStringConverter::Flag::ConvertInvalidToNull));
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
+ // moved codecs also work:
|
||||
|
||||
{
|
||||
- QStringEncoder encoder(codec, QStringConverter::Flag::ConvertInvalidToNull);
|
||||
+ QStringEncoder dec(codec);
|
||||
+ check(std::move(dec));
|
||||
+ }
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
|
||||
- QByteArray fullyConverted = encoder.encode(source);
|
||||
- encoder.resetState();
|
||||
- QByteArray stepByStepConverted;
|
||||
- for (const auto& codeUnit: source) {
|
||||
- stepByStepConverted += encoder.encode(codeUnit);
|
||||
- }
|
||||
- QCOMPARE(stepByStepConverted, fullyConverted);
|
||||
+ {
|
||||
+ QStringEncoder dec(codec, QStringConverter::Flag::ConvertInvalidToNull);
|
||||
+ check(std::move(dec));
|
||||
}
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
}
|
||||
|
||||
void tst_QStringConverter::byteByByteConsistency_data()
|
||||
@@ -615,11 +623,10 @@ void tst_QStringConverter::byteByByteConsistency_data()
|
||||
|
||||
void tst_QStringConverter::byteByByteConsistency()
|
||||
{
|
||||
- QFETCH(QByteArray, source);
|
||||
- QFETCH(QByteArray, codec);
|
||||
+ QFETCH(const QByteArray, source);
|
||||
+ QFETCH(const QByteArray, codec);
|
||||
|
||||
- {
|
||||
- QStringDecoder decoder(codec);
|
||||
+ const auto check = [&](QStringDecoder decoder) {
|
||||
if (!decoder.isValid())
|
||||
QSKIP("Unsupported codec");
|
||||
|
||||
@@ -632,23 +639,28 @@ void tst_QStringConverter::byteByByteConsistency()
|
||||
stepByStepConverted += decoder.decode(singleChar);
|
||||
}
|
||||
QCOMPARE(stepByStepConverted, fullyConverted);
|
||||
- }
|
||||
+ };
|
||||
+
|
||||
+ check(QStringDecoder(codec));
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
+ check(QStringDecoder(codec, QStringConverter::Flag::ConvertInvalidToNull));
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
+ // moved codecs also work:
|
||||
|
||||
{
|
||||
- QStringDecoder decoder(codec, QStringConverter::Flag::ConvertInvalidToNull);
|
||||
- if (!decoder.isValid())
|
||||
- QSKIP("Unsupported codec");
|
||||
+ QStringDecoder dec(codec);
|
||||
+ check(std::move(dec));
|
||||
+ }
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
|
||||
- QString fullyConverted = decoder.decode(source);
|
||||
- decoder.resetState();
|
||||
- QString stepByStepConverted;
|
||||
- for (const auto& byte: source) {
|
||||
- QByteArray singleChar;
|
||||
- singleChar.append(byte);
|
||||
- stepByStepConverted += decoder.decode(singleChar);
|
||||
- }
|
||||
- QCOMPARE(stepByStepConverted, fullyConverted);
|
||||
+ {
|
||||
+ QStringDecoder dec(codec, QStringConverter::Flag::ConvertInvalidToNull);
|
||||
+ check(std::move(dec));
|
||||
}
|
||||
+ if (QTest::currentTestResolved()) return;
|
||||
+
|
||||
}
|
||||
|
||||
void tst_QStringConverter::statefulPieceWise()
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri May 3 07:15:23 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
||||
|
||||
- Add upstream security fix (CVE-2024-33861):
|
||||
* 0001-QStringConverterICU-Pass-correct-pointer-to-callback.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Apr 2 13:39:34 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
||||
|
||||
|
@ -40,6 +40,7 @@ Source: https://download.qt.io/official_releases/qt/%{short_version}/%{r
|
||||
Source99: qt6-base-rpmlintrc
|
||||
# Patches 0-100 are upstream patches #
|
||||
Patch0: fix_builds_with_Werror.patch
|
||||
Patch1: 0001-QStringConverterICU-Pass-correct-pointer-to-callback.patch
|
||||
# Patches 100-200 are openSUSE and/or non-upstream(able) patches #
|
||||
Patch100: 0001-CMake-ELF-allow-using-Qt-s-full-version-number-in-th.patch
|
||||
# No need to pollute the library dir with object files, install them in the qt6 subfolder
|
||||
|
Loading…
x
Reference in New Issue
Block a user