From 897907f401618b9a19909fb12b3060ca4cd9f362 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 28 Feb 2022 11:10:44 +0100 Subject: ImageViewer: Handle invalid SVGs and GIFs nicely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fail opening the file in the image viewer, like we do for other images, so Qt Creator can offer a different editor (binary editor). We have separate code paths/backends for SVGs and movies (including GIFs), which didn't catch invalid images early. Fixes: QTCREATORBUG-27121 Change-Id: I1bfbca70b7d76ee9cac3e0f35494b62e3856069e Reviewed-by: Reviewed-by: Robert Löhning Reviewed-by: David Schulz --- src/plugins/imageviewer/imageviewerfile.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src/plugins/imageviewer') diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp index 3fe26890d0..1353de9a49 100644 --- a/src/plugins/imageviewer/imageviewerfile.cpp +++ b/src/plugins/imageviewer/imageviewerfile.cpp @@ -111,7 +111,7 @@ Core::IDocument::OpenResult ImageViewerFile::openImpl(QString *errorString, if (format.startsWith("svg")) { m_tempSvgItem = new QGraphicsSvgItem(fileName); QRectF bound = m_tempSvgItem->boundingRect(); - if (qFuzzyIsNull(bound.width()) && qFuzzyIsNull(bound.height())) { + if (!bound.isValid() || (qFuzzyIsNull(bound.width()) && qFuzzyIsNull(bound.height()))) { delete m_tempSvgItem; m_tempSvgItem = nullptr; if (errorString) @@ -123,8 +123,17 @@ Core::IDocument::OpenResult ImageViewerFile::openImpl(QString *errorString, } else #endif if (QMovie::supportedFormats().contains(format)) { - m_type = TypeMovie; m_movie = new QMovie(fileName, QByteArray(), this); + // force reading movie/image data, so we can catch completely invalid movies/images early: + m_movie->jumpToNextFrame(); + if (!m_movie->isValid()) { + if (errorString) + *errorString = tr("Failed to read image."); + delete m_movie; + m_movie = nullptr; + return OpenResult::CannotHandle; + } + m_type = TypeMovie; m_movie->setCacheMode(QMovie::CacheAll); connect( m_movie, -- cgit v1.2.1