From 0414104067939c6ec890634ff3c294265070c6c9 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 12 Nov 2022 23:09:27 +0100 Subject: [PATCH] YACReader: Fix crash when exiting while processing a comic When quitting YACReader while processing a comic, the comic thread needs to be properly terminated to avoid segfaults and other possible problems. --- CHANGELOG.md | 2 ++ YACReader/render.cpp | 23 +++++++++++++---------- common/comic.cpp | 2 ++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe2bced..8de31e0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ## WIP +### YACReader +*Fix segfault (or worse) when exiting YACReader while processing a comic ### YACReaderLibrary * Fixed drag&drop in the comics grid view. * Detect back/forward mouse buttons to move back and forward through the browsing history. diff --git a/YACReader/render.cpp b/YACReader/render.cpp index a0218a68..fee12b11 100644 --- a/YACReader/render.cpp +++ b/YACReader/render.cpp @@ -382,20 +382,23 @@ Render::Render() Render::~Render() { - if (comic != nullptr) { - comic->moveToThread(QApplication::instance()->thread()); - comic->deleteLater(); + for (auto *pr : pageRenders) { + if (pr != nullptr && pr->wait()) { + delete pr; + } } - foreach (PageRender *pr, pageRenders) - if (pr != nullptr) { - if (pr->wait()) - delete pr; - } - // TODO move to share_ptr - foreach (ImageFilter *filter, filters) + for (auto *filter : filters) { delete filter; + } + + if (comic != nullptr) { + comic->invalidate(); + comic->deleteLater(); + comic->thread()->quit(); + comic->thread()->wait(); + } } // Este método se encarga de forzar el renderizado de las páginas. // Actualiza el buffer según es necesario. diff --git a/common/comic.cpp b/common/comic.cpp index 0349bf93..69882fae 100644 --- a/common/comic.cpp +++ b/common/comic.cpp @@ -890,8 +890,10 @@ void PDFComic::renderPage(int page) #endif QByteArray ba; QBuffer buf(&ba); + buf.open(QIODevice::WriteOnly); img.save(&buf, "jpg", 96); _pages[page] = ba; + buf.close(); emit imageLoaded(page); emit imageLoaded(page, _pages[page]); }