summaryrefslogtreecommitdiff
path: root/src/svg/qsvgtinydocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/svg/qsvgtinydocument.cpp')
-rw-r--r--src/svg/qsvgtinydocument.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/svg/qsvgtinydocument.cpp b/src/svg/qsvgtinydocument.cpp
index 8e12d5c..3bd0064 100644
--- a/src/svg/qsvgtinydocument.cpp
+++ b/src/svg/qsvgtinydocument.cpp
@@ -73,13 +73,15 @@ QSvgTinyDocument::~QSvgTinyDocument()
}
#ifndef QT_NO_COMPRESS
+static QByteArray qt_inflateSvgzDataFrom(QIODevice *device, bool doCheckContent = true);
# ifdef QT_BUILD_INTERNAL
-Q_AUTOTEST_EXPORT QByteArray qt_inflateGZipDataFrom(QIODevice *device);
-# else
-static QByteArray qt_inflateGZipDataFrom(QIODevice *device);
+Q_AUTOTEST_EXPORT QByteArray qt_inflateGZipDataFrom(QIODevice *device)
+{
+ return qt_inflateSvgzDataFrom(device, false); // autotest wants unchecked result
+}
# endif
-QByteArray qt_inflateGZipDataFrom(QIODevice *device)
+static QByteArray qt_inflateSvgzDataFrom(QIODevice *device, bool doCheckContent)
{
if (!device)
return QByteArray();
@@ -155,6 +157,17 @@ QByteArray qt_inflateGZipDataFrom(QIODevice *device)
// it means we have to provide more data, so exit the loop here
} while (!zlibStream.avail_out);
+ if (doCheckContent) {
+ // Quick format check, equivalent to QSvgIOHandler::canRead()
+ QByteArray buf = destination.left(8);
+ if (!buf.contains("<?xml") && !buf.contains("<svg") && !buf.contains("<!--")) {
+ inflateEnd(&zlibStream);
+ qCWarning(lcSvgHandler, "Error while inflating gzip file: SVG format check failed");
+ return QByteArray();
+ }
+ doCheckContent = false; // Run only once, on first chunk
+ }
+
if (zlibResult == Z_STREAM_END) {
// Make sure there are no more members to process before exiting
if (!(zlibStream.avail_in && inflateReset(&zlibStream) == Z_OK))
@@ -182,7 +195,7 @@ QSvgTinyDocument * QSvgTinyDocument::load(const QString &fileName)
#ifndef QT_NO_COMPRESS
if (fileName.endsWith(QLatin1String(".svgz"), Qt::CaseInsensitive)
|| fileName.endsWith(QLatin1String(".svg.gz"), Qt::CaseInsensitive)) {
- return load(qt_inflateGZipDataFrom(&file));
+ return load(qt_inflateSvgzDataFrom(&file));
}
#endif
@@ -205,7 +218,7 @@ QSvgTinyDocument * QSvgTinyDocument::load(const QByteArray &contents)
// Check for gzip magic number and inflate if appropriate
if (contents.startsWith("\x1f\x8b")) {
QBuffer buffer(const_cast<QByteArray *>(&contents));
- const QByteArray inflated = qt_inflateGZipDataFrom(&buffer);
+ const QByteArray inflated = qt_inflateSvgzDataFrom(&buffer);
if (inflated.isNull())
return nullptr;
return load(inflated);