commit: 0613524c927b0e15a323dbf0c42e44a3cec7c502 Author: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> AuthorDate: Mon Dec 25 19:19:34 2023 +0000 Commit: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> CommitDate: Mon Dec 25 19:51:00 2023 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=0613524c
kde-frameworks/kio: Fix dolphin crash while copying KDE-bug: https://bugs.kde.org/show_bug.cgi?id=448532 Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org> .../kio-5.113.0-fix-crash-while-copying.patch | 184 +++++++++++++++++++++ kde-frameworks/kio/kio-5.113.0-r1.ebuild | 96 +++++++++++ 2 files changed, 280 insertions(+) diff --git a/kde-frameworks/kio/files/kio-5.113.0-fix-crash-while-copying.patch b/kde-frameworks/kio/files/kio-5.113.0-fix-crash-while-copying.patch new file mode 100644 index 000000000000..845e6bc64339 --- /dev/null +++ b/kde-frameworks/kio/files/kio-5.113.0-fix-crash-while-copying.patch @@ -0,0 +1,184 @@ +From 6bea074739d5a75920d5540bc266549df5642511 Mon Sep 17 00:00:00 2001 +From: Akseli Lahtinen <akse...@akselmo.dev> +Date: Fri, 1 Dec 2023 11:27:26 +0000 +Subject: [PATCH] WidgetsAskUserActionHandler: Use QPointer to check the + validity of parent widgets + +If Dolphin is closed during the copying process, +and the overwrite/skip dialog appears, +this crashes the copying process since the +parent shows to faulty location. + +Use QPointer to check that the parent widgets are still +valid. If not, we just use nullptr, and the dialogs +will still open. + +This also cleans some repetition in code. + +BUG:448532 +(cherry picked from commit bdef648edd54e146c30e881d8eb95990a59c5bbc) +--- + src/widgets/widgetsaskuseractionhandler.cpp | 90 +++++++++------------ + 1 file changed, 39 insertions(+), 51 deletions(-) + +diff --git a/src/widgets/widgetsaskuseractionhandler.cpp b/src/widgets/widgetsaskuseractionhandler.cpp +index fe2975d0ce..9cbaaec99f 100644 +--- a/src/widgets/widgetsaskuseractionhandler.cpp ++++ b/src/widgets/widgetsaskuseractionhandler.cpp +@@ -22,6 +22,7 @@ + + #include <QApplication> + #include <QDialogButtonBox> ++#include <QPointer> + #include <QRegularExpression> + #include <QUrl> + +@@ -40,7 +41,10 @@ + void savePersistentUserReply(KIO::AskUserActionInterface::MessageDialogType type, KConfigGroup &cg, const QString &dontAskAgainName, int result); + + WidgetsAskUserActionHandler *const q; +- QWidget *m_parentWidget = nullptr; ++ QPointer<QWidget> m_parentWidget = nullptr; ++ ++ QWidget *getParentWidget(KJob *job); ++ QWidget *getParentWidget(QWidget *widget); + }; + + bool KIO::WidgetsAskUserActionHandlerPrivate::gotPersistentUserReply(KIO::AskUserActionInterface::MessageDialogType type, +@@ -106,6 +110,36 @@ + } + } + ++QWidget *KIO::WidgetsAskUserActionHandlerPrivate::getParentWidget(KJob *job) ++{ ++ // This needs to be in qpointer, otherwise copying process ++ // will crash if done in background and dolphin is closed ++ QPointer<QWidget> parentWidget = nullptr; ++ ++ if (job) { ++ parentWidget = KJobWidgets::window(job); ++ } ++ ++ return getParentWidget(parentWidget); ++} ++ ++QWidget *KIO::WidgetsAskUserActionHandlerPrivate::getParentWidget(QWidget *widget) ++{ ++ // This needs to be in qpointer, otherwise copying process ++ // will crash if done in background and dolphin is closed ++ QPointer<QWidget> parentWidget = widget; ++ ++ if (!parentWidget) { ++ parentWidget = this->m_parentWidget; ++ } ++ ++ if (!parentWidget) { ++ parentWidget = qApp->activeWindow(); ++ } ++ ++ return parentWidget; ++} ++ + KIO::WidgetsAskUserActionHandler::WidgetsAskUserActionHandler(QObject *parent) + : KIO::AskUserActionInterface(parent) + , d(new WidgetsAskUserActionHandlerPrivate(this)) +@@ -128,22 +162,8 @@ + const QDateTime &mtimeSrc, + const QDateTime &mtimeDest) + { +- QWidget *parentWidget = nullptr; +- +- if (job) { +- parentWidget = KJobWidgets::window(job); +- } +- +- if (!parentWidget) { +- parentWidget = d->m_parentWidget; +- } +- +- if (!parentWidget) { +- parentWidget = qApp->activeWindow(); +- } +- + QMetaObject::invokeMethod(qGuiApp, [=] { +- auto *dlg = new KIO::RenameDialog(parentWidget, title, src, dest, options, sizeSrc, sizeDest, ctimeSrc, ctimeDest, mtimeSrc, mtimeDest); ++ auto *dlg = new KIO::RenameDialog(d->getParentWidget(job), title, src, dest, options, sizeSrc, sizeDest, ctimeSrc, ctimeDest, mtimeSrc, mtimeDest); + + dlg->setAttribute(Qt::WA_DeleteOnClose); + dlg->setWindowModality(Qt::WindowModal); +@@ -161,22 +181,8 @@ + + void KIO::WidgetsAskUserActionHandler::askUserSkip(KJob *job, KIO::SkipDialog_Options options, const QString &errorText) + { +- QWidget *parentWidget = nullptr; +- +- if (job) { +- parentWidget = KJobWidgets::window(job); +- } +- +- if (!parentWidget) { +- parentWidget = d->m_parentWidget; +- } +- +- if (!parentWidget) { +- parentWidget = qApp->activeWindow(); +- } +- + QMetaObject::invokeMethod(qGuiApp, [=] { +- auto *dlg = new KIO::SkipDialog(parentWidget, options, errorText); ++ auto *dlg = new KIO::SkipDialog(d->getParentWidget(job), options, errorText); + dlg->setAttribute(Qt::WA_DeleteOnClose); + dlg->setWindowModality(Qt::WindowModal); + +@@ -373,16 +379,6 @@ + return; + } + +- QWidget *parentWidget = parent; +- +- if (!parentWidget) { +- parentWidget = d->m_parentWidget; +- } +- +- if (!parentWidget) { +- parentWidget = qApp->activeWindow(); +- } +- + const KGuiItem primaryActionButton(primaryActionText, primaryActionIconName); + const KGuiItem secondaryActionButton(secondaryActionText, secondaryActionIconName); + +@@ -412,7 +408,7 @@ + hasCancelButton = true; + break; + case AskUserActionInterface::SSLMessageBox: +- d->sslMessageBox(text, metaData, parentWidget); ++ d->sslMessageBox(text, metaData, d->getParentWidget(parent)); + return; + case AskUserActionInterface::Information: + dlgType = KMessageDialog::Information; +@@ -442,7 +438,7 @@ + + QMetaObject::invokeMethod(qGuiApp, [=]() { + auto cancelButton = hasCancelButton ? KStandardGuiItem::cancel() : KGuiItem(); +- auto *dialog = new KMessageDialog(dlgType, text, parentWidget); ++ auto *dialog = new KMessageDialog(dlgType, text, d->getParentWidget(parent)); + + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->setCaption(title); +@@ -492,15 +488,7 @@ + + void KIO::WidgetsAskUserActionHandlerPrivate::sslMessageBox(const QString &text, const KIO::MetaData &metaData, QWidget *parent) + { +- QWidget *parentWidget = parent; +- +- if (!parentWidget) { +- parentWidget = m_parentWidget; +- } +- +- if (!parentWidget) { +- parentWidget = qApp->activeWindow(); +- } ++ QWidget *parentWidget = getParentWidget(parent); + + const QStringList sslList = metaData.value(QStringLiteral("ssl_peer_chain")).split(QLatin1Char('\x01'), Qt::SkipEmptyParts); + diff --git a/kde-frameworks/kio/kio-5.113.0-r1.ebuild b/kde-frameworks/kio/kio-5.113.0-r1.ebuild new file mode 100644 index 000000000000..1d6824b359b1 --- /dev/null +++ b/kde-frameworks/kio/kio-5.113.0-r1.ebuild @@ -0,0 +1,96 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +ECM_DESIGNERPLUGIN="true" +ECM_HANDBOOK="optional" +ECM_HANDBOOK_DIR="docs" +ECM_TEST="forceoptional" +PVCUT=$(ver_cut 1-2) +QTMIN=5.15.9 +inherit ecm frameworks.kde.org xdg-utils + +DESCRIPTION="Framework providing transparent file and data management" + +LICENSE="LGPL-2+" +KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86" +IUSE="acl kerberos kf6compat +kwallet X" + +# tests hang +RESTRICT="test" + +RDEPEND=" + >=dev-qt/qtdbus-${QTMIN}:5 + >=dev-qt/qtdeclarative-${QTMIN}:5 + >=dev-qt/qtgui-${QTMIN}:5 + >=dev-qt/qtnetwork-${QTMIN}:5[ssl] + >=dev-qt/qtwidgets-${QTMIN}:5 + >=dev-qt/qtxml-${QTMIN}:5 + =kde-frameworks/kauth-${PVCUT}*:5 + =kde-frameworks/karchive-${PVCUT}*:5 + =kde-frameworks/kbookmarks-${PVCUT}*:5 + =kde-frameworks/kcodecs-${PVCUT}*:5 + =kde-frameworks/kcompletion-${PVCUT}*:5 + =kde-frameworks/kconfig-${PVCUT}*:5 + =kde-frameworks/kconfigwidgets-${PVCUT}*:5 + =kde-frameworks/kcoreaddons-${PVCUT}*:5 + =kde-frameworks/kcrash-${PVCUT}*:5 + =kde-frameworks/kdbusaddons-${PVCUT}*:5 + =kde-frameworks/kguiaddons-${PVCUT}*:5 + =kde-frameworks/ki18n-${PVCUT}*:5 + =kde-frameworks/kiconthemes-${PVCUT}*:5 + =kde-frameworks/kitemviews-${PVCUT}*:5 + =kde-frameworks/kjobwidgets-${PVCUT}*:5 + =kde-frameworks/knotifications-${PVCUT}*:5 + =kde-frameworks/kservice-${PVCUT}*:5 + =kde-frameworks/ktextwidgets-${PVCUT}*:5 + =kde-frameworks/kwidgetsaddons-${PVCUT}*:5 + =kde-frameworks/kwindowsystem-${PVCUT}*:5[X?] + =kde-frameworks/kxmlgui-${PVCUT}*:5 + =kde-frameworks/solid-${PVCUT}*:5 + sys-power/switcheroo-control + acl? ( + sys-apps/attr + virtual/acl + ) + handbook? ( + dev-libs/libxml2 + dev-libs/libxslt + =kde-frameworks/kdoctools-${PVCUT}*:5 + ) + kerberos? ( virtual/krb5 ) + kf6compat? ( kde-apps/kio-extras:6 ) + kwallet? ( =kde-frameworks/kwallet-${PVCUT}*:5 ) + X? ( >=dev-qt/qtx11extras-${QTMIN}:5 ) +" +DEPEND="${RDEPEND} + >=dev-qt/qtconcurrent-${QTMIN}:5 + test? ( sys-libs/zlib ) +" +PDEPEND=">=kde-frameworks/kded-${PVCUT}:5" + +PATCHES=( "${FILESDIR}/${P}-fix-crash-while-copying.patch" ) # KDE-bug 448532 + +src_configure() { + local mycmakeargs=( + -DKIO_NO_PUBLIC_QTCONCURRENT=ON + $(cmake_use_find_package acl ACL) + $(cmake_use_find_package kerberos GSSAPI) + $(cmake_use_find_package kwallet KF5Wallet) + -DKF6_COMPAT_BUILD=$(usex kf6compat) + -DWITH_X11=$(usex X) + ) + + ecm_src_configure +} + +pkg_postinst() { + ecm_pkg_postinst + xdg_desktop_database_update +} + +pkg_postrm() { + ecm_pkg_postrm + xdg_desktop_database_update +}