qt-CVE-2023-43114
This commit is contained in:
parent
f6341934a9
commit
d41b1e56b0
@ -36,7 +36,7 @@
|
|||||||
Name: qt5-qtbase
|
Name: qt5-qtbase
|
||||||
Summary: Qt5 - QtBase components
|
Summary: Qt5 - QtBase components
|
||||||
Version: 5.15.10
|
Version: 5.15.10
|
||||||
Release: 4
|
Release: 5
|
||||||
|
|
||||||
# See LGPL_EXCEPTIONS.txt, for exception details
|
# See LGPL_EXCEPTIONS.txt, for exception details
|
||||||
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
@ -134,6 +134,8 @@ Patch0024: Fix-lupdate-command-error-on-loongarch64.patch
|
|||||||
Patch0025: CVE-2023-37369.patch
|
Patch0025: CVE-2023-37369.patch
|
||||||
# https://codereview.qt-project.org/c/qt/qtbase/+/488960
|
# https://codereview.qt-project.org/c/qt/qtbase/+/488960
|
||||||
Patch0026: qtbase5.15.10-CVE-2023-38197.patch
|
Patch0026: qtbase5.15.10-CVE-2023-38197.patch
|
||||||
|
# https://codereview.qt-project.org/c/qt/qtbase/+/503026
|
||||||
|
Patch0027: qtbase5.15.10-CVE-2023-43114.patch
|
||||||
# Do not check any files in %%{_qt5_plugindir}/platformthemes/ for requires.
|
# Do not check any files in %%{_qt5_plugindir}/platformthemes/ for requires.
|
||||||
# Those themes are there for platform integration. If the required libraries are
|
# Those themes are there for platform integration. If the required libraries are
|
||||||
# not there, the platform to integrate with isn't either. Then Qt will just
|
# not there, the platform to integrate with isn't either. Then Qt will just
|
||||||
@ -401,6 +403,7 @@ Qt5 libraries used for drawing widgets and OpenGL items.
|
|||||||
%patch -P0024 -p1
|
%patch -P0024 -p1
|
||||||
%patch -P0025 -p1
|
%patch -P0025 -p1
|
||||||
%patch -P0026 -p1
|
%patch -P0026 -p1
|
||||||
|
%patch -P0027 -p1
|
||||||
# move some bundled libs to ensure they're not accidentally used
|
# move some bundled libs to ensure they're not accidentally used
|
||||||
pushd src/3rdparty
|
pushd src/3rdparty
|
||||||
mkdir UNUSED
|
mkdir UNUSED
|
||||||
@ -1058,7 +1061,10 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Fri Nov 24 2023 peijiankang <peijiankang@kylinos.cn> - 5.15.10-4
|
* Fri Nov 24 2023 hua_yadong <huayadong@kylinos.cn> - 5.15.10-5
|
||||||
|
- fix qtbase5.15.10-CVE-2023-43114.patch
|
||||||
|
|
||||||
|
* Sat Nov 25 2023 hua_yadong <huayadong@kylinos.cn> - 5.15.10-4
|
||||||
- fix qtbase5.15.10-CVE-2023-38197.patch
|
- fix qtbase5.15.10-CVE-2023-38197.patch
|
||||||
|
|
||||||
* Wed Sep 13 2023 yoo <sunyuechi@iscas.ac.cn> - 5.15.10-3
|
* Wed Sep 13 2023 yoo <sunyuechi@iscas.ac.cn> - 5.15.10-3
|
||||||
|
|||||||
129
qtbase5.15.10-CVE-2023-43114.patch
Normal file
129
qtbase5.15.10-CVE-2023-43114.patch
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
From 61dedcc9d02dbd16cc1bd1cd8aafae96213104a1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: hua_yadong <huayadong@kylinos.cn>
|
||||||
|
Date: Sat, 25 Nov 2023 11:08:39 +0800
|
||||||
|
Subject: [PATCH] qtbase5.15.10-CVE-2023-43114
|
||||||
|
|
||||||
|
---
|
||||||
|
.../windows/qwindowsfontdatabase.cpp | 67 ++++++++++++++-----
|
||||||
|
1 file changed, 51 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
|
||||||
|
index 09d2d916..0e6fe5eb 100644
|
||||||
|
--- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
|
||||||
|
+++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp
|
||||||
|
@@ -1471,36 +1471,70 @@ QT_WARNING_POP
|
||||||
|
return fontEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static QList<quint32> getTrueTypeFontOffsets(const uchar *fontData)
|
||||||
|
+static QList<quint32> getTrueTypeFontOffsets(const uchar *fontData, const uchar *fileEndSentinel)
|
||||||
|
{
|
||||||
|
QList<quint32> offsets;
|
||||||
|
- const quint32 headerTag = *reinterpret_cast<const quint32 *>(fontData);
|
||||||
|
+ if (fileEndSentinel - fontData < 12) {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
+ return offsets;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ const quint32 headerTag = qFromUnaligned<quint32>(fontData);
|
||||||
|
if (headerTag != MAKE_TAG('t', 't', 'c', 'f')) {
|
||||||
|
if (headerTag != MAKE_TAG(0, 1, 0, 0)
|
||||||
|
&& headerTag != MAKE_TAG('O', 'T', 'T', 'O')
|
||||||
|
&& headerTag != MAKE_TAG('t', 'r', 'u', 'e')
|
||||||
|
- && headerTag != MAKE_TAG('t', 'y', 'p', '1'))
|
||||||
|
+ && headerTag != MAKE_TAG('t', 'y', 'p', '1')) {
|
||||||
|
return offsets;
|
||||||
|
+ }
|
||||||
|
offsets << 0;
|
||||||
|
return offsets;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ const quint32 maximumNumFonts = 0xffff;
|
||||||
|
const quint32 numFonts = qFromBigEndian<quint32>(fontData + 8);
|
||||||
|
- for (uint i = 0; i < numFonts; ++i) {
|
||||||
|
- offsets << qFromBigEndian<quint32>(fontData + 12 + i * 4);
|
||||||
|
+ if (numFonts > maximumNumFonts) {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Font collection of" << numFonts << "fonts is too large. Aborting.";
|
||||||
|
+ return offsets;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (quintptr(fileEndSentinel - fontData) > 12 + (numFonts - 1) * 4) {
|
||||||
|
+ for (quint32 i = 0; i < numFonts; ++i)
|
||||||
|
+ offsets << qFromBigEndian<quint32>(fontData + 12 + i * 4);
|
||||||
|
+ } else {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return offsets;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void getFontTable(const uchar *fileBegin, const uchar *data, quint32 tag, const uchar **table, quint32 *length)
|
||||||
|
+static void getFontTable(const uchar *fileBegin, const uchar *fileEndSentinel, const uchar *data, quint32 tag, const uchar **table, quint32 *length)
|
||||||
|
{
|
||||||
|
- const quint16 numTables = qFromBigEndian<quint16>(data + 4);
|
||||||
|
- for (uint i = 0; i < numTables; ++i) {
|
||||||
|
- const quint32 offset = 12 + 16 * i;
|
||||||
|
- if (*reinterpret_cast<const quint32 *>(data + offset) == tag) {
|
||||||
|
- *table = fileBegin + qFromBigEndian<quint32>(data + offset + 8);
|
||||||
|
- *length = qFromBigEndian<quint32>(data + offset + 12);
|
||||||
|
- return;
|
||||||
|
+ if (fileEndSentinel - data >= 6) {
|
||||||
|
+ const quint16 numTables = qFromBigEndian<quint16>(data + 4);
|
||||||
|
+ if (fileEndSentinel - data >= 28 + 16 * (numTables - 1)) {
|
||||||
|
+ for (quint32 i = 0; i < numTables; ++i) {
|
||||||
|
+ const quint32 offset = 12 + 16 * i;
|
||||||
|
+ if (qFromUnaligned<quint32>(data + offset) == tag) {
|
||||||
|
+ const quint32 tableOffset = qFromBigEndian<quint32>(data + offset + 8);
|
||||||
|
+ if (quintptr(fileEndSentinel - fileBegin) <= tableOffset) {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ *table = fileBegin + tableOffset;
|
||||||
|
+ *length = qFromBigEndian<quint32>(data + offset + 12);
|
||||||
|
+ if (quintptr(fileEndSentinel - *table) < *length) {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
}
|
||||||
|
+ } else {
|
||||||
|
+ qCWarning(lcQpaFonts) << "Corrupted font data detected";
|
||||||
|
}
|
||||||
|
*table = 0;
|
||||||
|
*length = 0;
|
||||||
|
@@ -1513,8 +1547,9 @@ static void getFamiliesAndSignatures(const QByteArray &fontData,
|
||||||
|
QVector<QFontValues> *values)
|
||||||
|
{
|
||||||
|
const uchar *data = reinterpret_cast<const uchar *>(fontData.constData());
|
||||||
|
+ const uchar *dataEndSentinel = data + fontData.size();
|
||||||
|
|
||||||
|
- QList<quint32> offsets = getTrueTypeFontOffsets(data);
|
||||||
|
+ QList<quint32> offsets = getTrueTypeFontOffsets(data, dataEndSentinel);
|
||||||
|
if (offsets.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -1522,7 +1557,7 @@ static void getFamiliesAndSignatures(const QByteArray &fontData,
|
||||||
|
const uchar *font = data + offsets.at(i);
|
||||||
|
const uchar *table;
|
||||||
|
quint32 length;
|
||||||
|
- getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length);
|
||||||
|
+ getFontTable(data, dataEndSentinel, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length);
|
||||||
|
if (!table)
|
||||||
|
continue;
|
||||||
|
QFontNames names = qt_getCanonicalFontNames(table, length);
|
||||||
|
@@ -1532,7 +1567,7 @@ static void getFamiliesAndSignatures(const QByteArray &fontData,
|
||||||
|
families->append(std::move(names));
|
||||||
|
|
||||||
|
if (values || signatures)
|
||||||
|
- getFontTable(data, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length);
|
||||||
|
+ getFontTable(data, dataEndSentinel, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length);
|
||||||
|
|
||||||
|
if (values) {
|
||||||
|
QFontValues fontValues;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user