Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libqt5-qtsvg for openSUSE:Factory 
checked in at 2021-04-19 21:05:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libqt5-qtsvg (Old)
 and      /work/SRC/openSUSE:Factory/.libqt5-qtsvg.new.12324 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libqt5-qtsvg"

Mon Apr 19 21:05:43 2021 rev:46 rq:885977 version:5.15.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/libqt5-qtsvg/libqt5-qtsvg.changes        
2020-11-25 19:29:38.982512795 +0100
+++ /work/SRC/openSUSE:Factory/.libqt5-qtsvg.new.12324/libqt5-qtsvg.changes     
2021-04-19 21:05:55.888023265 +0200
@@ -1,0 +2,11 @@
+Fri Apr 16 09:37:36 UTC 2021 - Fabian Vogt <fv...@suse.com>
+
+- Add commits from kde's 5.15 branch:
+  * 0001-Improve-handling-of-malformed-numeric-values-in-svg-.patch
+  * 0002-Clamp-parsed-doubles-to-float-representable-values.patch
+    (bsc#1184783, QTBUG-91507, CVE-2021-3481)
+  * 0003-Avoid-buffer-overflow-in-isSupportedSvgFeature.patch
+  * 0004-Make-image-handler-accept-UTF-16-UTF-32-encoded-SVGs.patch
+    (QTBUG-90744)
+
+-------------------------------------------------------------------

New:
----
  0001-Improve-handling-of-malformed-numeric-values-in-svg-.patch
  0002-Clamp-parsed-doubles-to-float-representable-values.patch
  0003-Avoid-buffer-overflow-in-isSupportedSvgFeature.patch
  0004-Make-image-handler-accept-UTF-16-UTF-32-encoded-SVGs.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libqt5-qtsvg.spec ++++++
--- /var/tmp/diff_new_pack.jIrwNG/_old  2021-04-19 21:05:56.412024051 +0200
+++ /var/tmp/diff_new_pack.jIrwNG/_new  2021-04-19 21:05:56.416024057 +0200
@@ -31,6 +31,11 @@
 URL:            https://www.qt.io
 Source:         
https://download.qt.io/official_releases/qt/5.15/%{real_version}/submodules/%{tar_version}.tar.xz
 Source1:        baselibs.conf
+# PATCH-FIX-UPSTREAM
+Patch1:         0001-Improve-handling-of-malformed-numeric-values-in-svg-.patch
+Patch2:         0002-Clamp-parsed-doubles-to-float-representable-values.patch
+Patch3:         0003-Avoid-buffer-overflow-in-isSupportedSvgFeature.patch
+Patch4:         0004-Make-image-handler-accept-UTF-16-UTF-32-encoded-SVGs.patch
 BuildRequires:  libQt5Core-private-headers-devel >= %{version}
 BuildRequires:  libQt5Gui-private-headers-devel >= %{version}
 BuildRequires:  libQt5Widgets-private-headers-devel >= %{version}
@@ -42,13 +47,15 @@
 BuildRequires:  pkgconfig
 BuildRequires:  xz
 BuildRequires:  pkgconfig(zlib)
+# Use git to apply the patches, Patch4 contains binary diffs
+BuildRequires:  git-core
 
 %description
 The Qt SVG module provides functionality for displaying SVG images
 as a widget, and to create SVG files using drawing commands.
 
 %prep
-%autosetup -p1 -n %{tar_version}
+%autosetup -p1 -S git -n %{tar_version}
 
 %package -n %{libname}
 Summary:        Qt 5 SVG Library

++++++ 0001-Improve-handling-of-malformed-numeric-values-in-svg-.patch ++++++
>From aceea78cc05ac8ff947cee9de8149b48771781a8 Mon Sep 17 00:00:00 2001
From: Eirik Aavitsland <eirik.aavitsl...@qt.io>
Date: Tue, 1 Dec 2020 14:39:59 +0100
Subject: [PATCH 1/4] Improve handling of malformed numeric values in svg files

Catch cases where the input is not containable in a qreal, and avoid
passing on inf values.

Change-Id: I1ab8932d94473916815385240c29e03afb0e0c9e
Reviewed-by: Robert Loehning <robert.loehn...@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jen...@qt.io>
(cherry picked from commit 428d56da9d5ed9bda51f7cc3c144996fb3a6a285)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_...@qt-project.org>
---
 src/svg/qsvghandler.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index c937254..b3d9aaf 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -65,6 +65,7 @@
 #include "private/qmath_p.h"
 
 #include "float.h"
+#include <cmath>
 
 QT_BEGIN_NAMESPACE
 
@@ -672,6 +673,8 @@ static qreal toDouble(const QChar *&str)
             val = -val;
     } else {
         val = QByteArray::fromRawData(temp, pos).toDouble();
+        if (qFpClassify(val) != FP_NORMAL)
+            val = 0;
     }
     return val;
 
-- 
2.25.1

++++++ 0002-Clamp-parsed-doubles-to-float-representable-values.patch ++++++
>From 95990cbeebc0ab9959e2a925a93ad4897416bbb7 Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jen...@qt.io>
Date: Thu, 4 Mar 2021 14:28:48 +0100
Subject: [PATCH 2/4] Clamp parsed doubles to float representable values
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Parts of our rendering assumes incoming doubles can still be sane
floats.

Fixes: QTBUG-91507
Change-Id: I7086a121e1b5ed47695a1251ea90e774dd8f148d
Reviewed-by: Robert L??hning <robert.loehn...@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jen...@qt.io>
Reviewed-by: M??rten Nordheim <marten.nordh...@qt.io>
(cherry picked from commit bfd6ee0d8cf34b63d32adf10ed93daa0086b359f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_...@qt-project.org>
---
 src/svg/qsvghandler.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index b3d9aaf..9dac05c 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -673,7 +673,8 @@ static qreal toDouble(const QChar *&str)
             val = -val;
     } else {
         val = QByteArray::fromRawData(temp, pos).toDouble();
-        if (qFpClassify(val) != FP_NORMAL)
+        // Do not tolerate values too wild to be represented normally by floats
+        if (qFpClassify(float(val)) != FP_NORMAL)
             val = 0;
     }
     return val;
@@ -3046,6 +3047,8 @@ static QSvgStyleProperty 
*createRadialGradientNode(QSvgNode *node,
         ncy = toDouble(cy);
     if (!r.isEmpty())
         nr = toDouble(r);
+    if (nr < 0.5)
+        nr = 0.5;
 
     qreal nfx = ncx;
     if (!fx.isEmpty())
-- 
2.25.1

++++++ 0003-Avoid-buffer-overflow-in-isSupportedSvgFeature.patch ++++++
>From 1c2072ad16e0097c15df701dc22f07bf481fc4ec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20L=C3=B6hning?= <robert.loehn...@qt.io>
Date: Wed, 17 Feb 2021 19:20:42 +0100
Subject: [PATCH 3/4] Avoid buffer overflow in isSupportedSvgFeature

Fixes oss-fuzz issue 29873.

Pick-to: 6.0 6.1
Change-Id: I382683aa2d7d3cf2d05a0b8c41ebf21d032fbd7c
Reviewed-by: Eirik Aavitsland <eirik.aavitsl...@qt.io>
(cherry picked from commit afde7ca3a40f524e40052df696f74190452b22cb)
---
 src/svg/qsvgstructure.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/svg/qsvgstructure.cpp b/src/svg/qsvgstructure.cpp
index b89608b..89c9e4e 100644
--- a/src/svg/qsvgstructure.cpp
+++ b/src/svg/qsvgstructure.cpp
@@ -255,9 +255,13 @@ inline static bool isSupportedSvgFeature(const QString 
&str)
     };
 
     if (str.length() <= MAX_WORD_LENGTH && str.length() >= MIN_WORD_LENGTH) {
+        const char16_t unicode44 = str.at(44).unicode();
+        const char16_t unicode45 = str.at(45).unicode();
+        if (unicode44 >= sizeof(asso_values) || unicode45 >= 
sizeof(asso_values))
+            return false;
         const int key = str.length()
-                        + asso_values[str.at(45).unicode()]
-                        + asso_values[str.at(44).unicode()];
+                        + asso_values[unicode45]
+                        + asso_values[unicode44];
         if (key <= MAX_HASH_VALUE && key >= 0)
             return str == QLatin1String(wordlist[key]);
     }
-- 
2.25.1

++++++ 0004-Make-image-handler-accept-UTF-16-UTF-32-encoded-SVGs.patch ++++++
>From cfc616978b52a396b2ef6900546f7fc086d7cab3 Mon Sep 17 00:00:00 2001
From: Eirik Aavitsland <eirik.aavitsl...@qt.io>
Date: Thu, 8 Apr 2021 13:19:52 +0200
Subject: [PATCH 4/4] Make image handler accept UTF-16/UTF-32 encoded SVGs

The canRead() header checks assumed 8 bit encoding.

Pick-to: 6.1 6.0 5.15
Fixes: QTBUG-90744
Change-Id: Ibe934fe9ed31b89ee0fbfc4562aa66ab1b359225
Reviewed-by: Allan Sandfeld Jensen <allan.jen...@qt.io>
(cherry picked from commit 45fb1f07eaa984af40fca9f12b8f3d27f7b0e9ac)
---
 .../imageformats/svg/qsvgiohandler.cpp        |  37 +++++++++++-------
 tests/auto/qsvgplugin/simple_Utf16BE.svg      | Bin 0 -> 228 bytes
 tests/auto/qsvgplugin/simple_Utf16LE.svg      | Bin 0 -> 228 bytes
 tests/auto/qsvgplugin/simple_Utf32BE.svg      | Bin 0 -> 456 bytes
 tests/auto/qsvgplugin/simple_Utf32LE.svg      | Bin 0 -> 456 bytes
 tests/auto/qsvgplugin/simple_Utf8.svg         |   3 ++
 tests/auto/qsvgplugin/tst_qsvgplugin.cpp      |  32 +++++++++++++++
 7 files changed, 57 insertions(+), 15 deletions(-)
 create mode 100644 tests/auto/qsvgplugin/simple_Utf16BE.svg
 create mode 100644 tests/auto/qsvgplugin/simple_Utf16LE.svg
 create mode 100644 tests/auto/qsvgplugin/simple_Utf32BE.svg
 create mode 100644 tests/auto/qsvgplugin/simple_Utf32LE.svg
 create mode 100644 tests/auto/qsvgplugin/simple_Utf8.svg

diff --git a/src/plugins/imageformats/svg/qsvgiohandler.cpp 
b/src/plugins/imageformats/svg/qsvgiohandler.cpp
index bd39b2a..4136aaf 100644
--- a/src/plugins/imageformats/svg/qsvgiohandler.cpp
+++ b/src/plugins/imageformats/svg/qsvgiohandler.cpp
@@ -118,6 +118,24 @@ QSvgIOHandler::~QSvgIOHandler()
     delete d;
 }
 
+static bool isPossiblySvg(QIODevice *device, bool *isCompressed = nullptr)
+{
+    constexpr int bufSize = 64;
+    char buf[bufSize];
+    const qint64 readLen = device->peek(buf, bufSize);
+    if (readLen < 8)
+        return false;
+#    ifndef QT_NO_COMPRESS
+    if (quint8(buf[0]) == 0x1f && quint8(buf[1]) == 0x8b) {
+        if (isCompressed)
+            *isCompressed = true;
+        return true;
+    }
+#    endif
+    QTextStream str(QByteArray::fromRawData(buf, readLen));
+    QByteArray ba = str.read(16).trimmed().toLatin1();
+    return ba.startsWith("<?xml") || ba.startsWith("<svg") || 
ba.startsWith("<!--") || ba.startsWith("<!DOCTYPE svg");
+}
 
 bool QSvgIOHandler::canRead() const
 {
@@ -126,15 +144,9 @@ bool QSvgIOHandler::canRead() const
     if (d->loaded && !d->readDone)
         return true;        // Will happen if we have been asked for the size
 
-    QByteArray buf = device()->peek(16);
-#ifndef QT_NO_COMPRESS
-    if (buf.startsWith("\x1f\x8b")) {
-        setFormat("svgz");
-        return true;
-    } else
-#endif
-    if (buf.contains("<?xml") || buf.contains("<svg") || buf.contains("<!--") 
|| buf.contains("<!DOCTYPE svg")) {
-        setFormat("svg");
+    bool isCompressed = false;
+    if (isPossiblySvg(device(), &isCompressed)) {
+        setFormat(isCompressed ? "svgz" : "svg");
         return true;
     }
     return false;
@@ -260,12 +272,7 @@ bool QSvgIOHandler::supportsOption(ImageOption option) 
const
 
 bool QSvgIOHandler::canRead(QIODevice *device)
 {
-    QByteArray buf = device->peek(16);
-    return
-#ifndef QT_NO_COMPRESS
-            buf.startsWith("\x1f\x8b") ||
-#endif
-            buf.contains("<?xml") || buf.contains("<svg") || 
buf.contains("<!--") || buf.contains("<!DOCTYPE svg");
+    return isPossiblySvg(device);
 }
 
 QT_END_NAMESPACE
diff --git a/tests/auto/qsvgplugin/simple_Utf16BE.svg 
b/tests/auto/qsvgplugin/simple_Utf16BE.svg
new file mode 100644
index 
0000000000000000000000000000000000000000..c3312cb2a98dc3a2a7f42100720a94ee913ab641
GIT binary patch
literal 228
zcmY+8!3x4a3`F1AuUP86TPwXt^=FD(h1JSdZ2kG_Y$$>ZBuq%=W%<xD@}kG7o=I|7
z2JRdw*illcJ7#V~O-GwwcuEfrcxf_~s(bAZ%IGz%b(!VY{DKo3B{>m0F_LN&(W%dt
i+N`XO_n%MZY8v|_=r&6EzpW7h!FvAF8>RhG#ry&V93m0`

literal 0
HcmV?d00001

diff --git a/tests/auto/qsvgplugin/simple_Utf16LE.svg 
b/tests/auto/qsvgplugin/simple_Utf16LE.svg
new file mode 100644
index 
0000000000000000000000000000000000000000..cdbeda92a5145faf70fcc8dcdf034141a66f59cf
GIT binary patch
literal 228
zcmY+8!3x4a3`F1AuUP86tCe14^=FD(h1JSdZ2ft4HWWby5+)?`@_7eFp7c1?6It%U
zz>NbHTWU7yj+rY-)6wQ<9@3pXUYbm`>Q4KEGI~uLT^9Kzzv9SBNsd4#MpjKCI`!F7
h+lAHf`t#XbLu;Qz-6pC0w>Cl~S}%Wkql6!|Fux@+A`$=q

literal 0
HcmV?d00001

diff --git a/tests/auto/qsvgplugin/simple_Utf32BE.svg 
b/tests/auto/qsvgplugin/simple_Utf32BE.svg
new file mode 100644
index 
0000000000000000000000000000000000000000..0d5d02c1ba98a60908ca852692bf5f1124d4b64b
GIT binary patch
literal 456
zcmaKnNeV(i3<Z1bDT3}DaU<$w#0i{Gak#u%B^~&<a8V@Pncgeq^)97M;Q}{UL)3gp
zJcG3@9N_>nXu|-y(68?xK41?!u-Dn_-;iG`C*lNpl{+zUr}+rXy{itj**^qtCjK?`
zt8ES~h>9K;pbvMMt5J^uzSW*u$K*|4)}Mds?#x;BIj@d@6?oTsl6@WW^k9$VJ7@Kl
LUi9$m^;`P@=Ncjs

literal 0
HcmV?d00001

diff --git a/tests/auto/qsvgplugin/simple_Utf32LE.svg 
b/tests/auto/qsvgplugin/simple_Utf32LE.svg
new file mode 100644
index 
0000000000000000000000000000000000000000..58a71596656a79d9540b6bbef92e6b40aec46871
GIT binary patch
literal 456
zcmaKnNeV(i3<b0H6pij3aU=RKBTnFiio@mAD(Jw+g^MET&h*~r9WjrHE8JlNrRFQ*
z1+4Ah1V>mv7e>&BVSN|k6ArKkd!5bxE%~i-CeC0`c@PtKnoq#oyXsJz{bTTE;$K_8
z+8XFUspxSD`f!)I8ueJfx7t(dl)UZB`s+{KojI#M=habQ4c_&hWM7XwJ=i1p&RM;s
K7d`xX&Ds}BU?LI#

literal 0
HcmV?d00001

diff --git a/tests/auto/qsvgplugin/simple_Utf8.svg 
b/tests/auto/qsvgplugin/simple_Utf8.svg
new file mode 100644
index 0000000..2052c48
--- /dev/null
+++ b/tests/auto/qsvgplugin/simple_Utf8.svg
@@ -0,0 +1,3 @@
+???<svg version="1.0" xmlns="http://www.w3.org/2000/svg";>
+  <circle cx="50" cy="50" r="25" fill="#00ff00" />
+</svg>
diff --git a/tests/auto/qsvgplugin/tst_qsvgplugin.cpp 
b/tests/auto/qsvgplugin/tst_qsvgplugin.cpp
index e1f84f3..73bbe8b 100644
--- a/tests/auto/qsvgplugin/tst_qsvgplugin.cpp
+++ b/tests/auto/qsvgplugin/tst_qsvgplugin.cpp
@@ -61,6 +61,8 @@ private slots:
     void checkSize_data();
     void checkSize();
     void checkImageInclude();
+    void encodings_data();
+    void encodings();
 };
 
 
@@ -145,6 +147,36 @@ void tst_QSvgPlugin::checkImageInclude()
     logMessages.clear();
 }
 
+void tst_QSvgPlugin::encodings_data()
+{
+    QTest::addColumn<QString>("filename");
+
+    QTest::newRow("utf-8") << QFINDTESTDATA("simple_Utf8.svg");
+    QTest::newRow("utf-16LE") << QFINDTESTDATA("simple_Utf16LE.svg");
+    QTest::newRow("utf-16BE") << QFINDTESTDATA("simple_Utf16BE.svg");
+    QTest::newRow("utf-32LE") << QFINDTESTDATA("simple_Utf32LE.svg");
+    QTest::newRow("utf-32BE") << QFINDTESTDATA("simple_Utf32BE.svg");
+}
+
+void tst_QSvgPlugin::encodings()
+{
+    QFETCH(QString, filename);
+
+    {
+        QFile file(filename);
+        file.open(QIODevice::ReadOnly);
+        QVERIFY(QSvgIOHandler::canRead(&file));
+    }
+
+    QFile file(filename);
+    file.open(QIODevice::ReadOnly);
+    QSvgIOHandler plugin;
+    plugin.setDevice(&file);
+    QVERIFY(plugin.canRead());
+    QImage img;
+    QVERIFY(plugin.read(&img));
+    QCOMPARE(img.size(), QSize(50, 50));
+}
 
 QTEST_MAIN(tst_QSvgPlugin)
 #include "tst_qsvgplugin.moc"
-- 
2.25.1

Reply via email to