diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2024-01-25 22:18:02 -0700 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-02-02 07:01:07 +0000 |
commit | fb8b5abb4cf6859323e4eef9e3c00b301d8ce7d0 (patch) | |
tree | 5ffdcbd52323a049af3bdce5eabca020247db092 | |
parent | 57774a5eba87bc1ba181effefe9dc614f2d3330c (diff) |
QPdfIOHandler: Ensure QPdfDocument still exists before rendering
If a PDF-viewing application is unceremoniously exited while
QQuickPixmapReader::processJobs() still has PDF rendering jobs
queued up, it could be that the shared QPdfDocument instance
is deleted just as QPdfIOHandler::read() starts the rendering.
Use a QPointer to avoid that.
Fixes: QTBUG-121502
Pick-to: 6.5
Change-Id: I5d0674ca77ab5015b710df49b3842064e65d4adc
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit ed49163c8fef019be18475b86694263801c3a8ea)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 77d2e9ad33a12dbc3e8ddc3ce40498b28029147f)
-rw-r--r-- | src/pdf/plugins/imageformats/pdf/qpdfiohandler.cpp | 10 | ||||
-rw-r--r-- | src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h | 2 |
2 files changed, 7 insertions, 5 deletions
diff --git a/src/pdf/plugins/imageformats/pdf/qpdfiohandler.cpp b/src/pdf/plugins/imageformats/pdf/qpdfiohandler.cpp index 195759028..bb3e7c929 100644 --- a/src/pdf/plugins/imageformats/pdf/qpdfiohandler.cpp +++ b/src/pdf/plugins/imageformats/pdf/qpdfiohandler.cpp @@ -62,7 +62,7 @@ int QPdfIOHandler::imageCount() const bool QPdfIOHandler::read(QImage *image) { if (load(device())) { - if (m_page >= m_doc->pageCount()) + if (m_doc.isNull() || m_page >= m_doc->pageCount()) return false; if (m_page < 0) m_page = 0; @@ -110,9 +110,11 @@ bool QPdfIOHandler::read(QImage *image) options.setScaledSize(pageSize); image->fill(m_backColor.rgba()); QPainter p(image); - QImage pageImage = m_doc->render(m_page, finalSize, options); - p.drawImage(0, 0, pageImage); - p.end(); + if (!m_doc.isNull()) { + QImage pageImage = m_doc->render(m_page, finalSize, options); + p.drawImage(0, 0, pageImage); + p.end(); + } } return true; } diff --git a/src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h b/src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h index 5918c0328..c4d8e0f9a 100644 --- a/src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h +++ b/src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h @@ -41,7 +41,7 @@ private: bool load(QIODevice *device); private: - QPdfDocument *m_doc = nullptr; + QPointer<QPdfDocument> m_doc; int m_page = -1; QRect m_clipRect; |