summaryrefslogtreecommitdiff
path: root/dev-qt/qtsvg/files/qtsvg-5.15.3-QTBUG-90744-minus-binarypatch.patch
blob: 1cdd5fd5ffccab287c057820b884546c5b30d2c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
From cfc616978b52a396b2ef6900546f7fc086d7cab3 Mon Sep 17 00:00:00 2001
From: Eirik Aavitsland <eirik.aavitsland@qt.io>
Date: Thu, 8 Apr 2021 13:19:52 +0200
Subject: [PATCH 3/9] 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.jensen@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/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.35.1