summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2024-01-25 22:18:02 -0700
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-02-02 07:01:07 +0000
commitfb8b5abb4cf6859323e4eef9e3c00b301d8ce7d0 (patch)
tree5ffdcbd52323a049af3bdce5eabca020247db092
parent57774a5eba87bc1ba181effefe9dc614f2d3330c (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.cpp10
-rw-r--r--src/pdf/plugins/imageformats/pdf/qpdfiohandler_p.h2
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;