From 5ebe88c3c2988c62baaffb71e0249e97fc30ba51 Mon Sep 17 00:00:00 2001 From: Michael Palimaka Date: Fri, 18 Nov 2016 01:35:17 +1100 Subject: dev-qt/qtcore: backport patch from upstream that resolves various crashes Gentoo-bug: 581068 Package-Manager: portage-2.3.2 --- dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch | 81 ++++++++++++++++++++++++++ dev-qt/qtcore/qtcore-5.6.2-r1.ebuild | 43 ++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch create mode 100644 dev-qt/qtcore/qtcore-5.6.2-r1.ebuild (limited to 'dev-qt') diff --git a/dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch b/dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch new file mode 100644 index 000000000000..d969869c0855 --- /dev/null +++ b/dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch @@ -0,0 +1,81 @@ +From ca4d93d85ee446c5e30ec8e7814651e45cbf1218 Mon Sep 17 00:00:00 2001 +From: Thiago Macieira +Date: Thu, 12 Nov 2015 10:14:51 -0800 +Subject: Stop unloading plugins in QPluginLoader and QFactoryLoader + +QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we +missed the equivalent code in QFactoryLoader (which bypasses +QPluginLoader). Besides, QPluginLoader::unload() was still doing +unloading, which it won't anymore. + +Not unloading plugins is Qt's policy, as decided during the 5.0 +development process and reaffirmed now in 5.6. This is due to static +data in plugins leaking out and remaining in use past the unloading of +the plugin, causing crashes. + +This does not affect QLibrary and QLibrary::unload(). Those are meant +for non-Qt loadable modules, so unloading them may be safe. + +Task-number: QTBUG-49061 +Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html +Change-Id: I461e9fc7199748faa187ffff1416070f138df8db +(cherry picked from commit 494376f980e96339b6f1eff7c41336ca4d853065) +Discussed-again-on: http://lists.qt-project.org/pipermail/development/2016-October/027476.html +Reviewed-by: Lars Knoll +--- + src/corelib/plugin/qfactoryloader.cpp | 6 ++++-- + src/corelib/plugin/qpluginloader.cpp | 5 +++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp +index dcf1b1a..b6558f5 100644 +--- a/src/corelib/plugin/qfactoryloader.cpp ++++ b/src/corelib/plugin/qfactoryloader.cpp +@@ -208,10 +208,12 @@ void QFactoryLoader::update() + ++keyUsageCount; + } + } +- if (keyUsageCount || keys.isEmpty()) ++ if (keyUsageCount || keys.isEmpty()) { ++ library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload + d->libraryList += library; +- else ++ } else { + library->release(); ++ } + } + } + #else +diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp +index 37f2368..0ea8280 100644 +--- a/src/corelib/plugin/qpluginloader.cpp ++++ b/src/corelib/plugin/qpluginloader.cpp +@@ -148,6 +148,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent) + : QObject(parent), d(0), did_load(false) + { + setFileName(fileName); ++ setLoadHints(QLibrary::PreventUnloadHint); + } + + /*! +@@ -342,7 +343,7 @@ static QString locatePlugin(const QString& fileName) + void QPluginLoader::setFileName(const QString &fileName) + { + #if defined(QT_SHARED) +- QLibrary::LoadHints lh; ++ QLibrary::LoadHints lh = QLibrary::PreventUnloadHint; + if (d) { + lh = d->loadHints(); + d->release(); +@@ -391,7 +392,7 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList) + \brief Give the load() function some hints on how it should behave. + + You can give hints on how the symbols in the plugin are +- resolved. By default, none of the hints are set. ++ resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set. + + See the documentation of QLibrary::loadHints for a complete + description of how this property works. +-- +cgit v1.0-4-g1e03 + diff --git a/dev-qt/qtcore/qtcore-5.6.2-r1.ebuild b/dev-qt/qtcore/qtcore-5.6.2-r1.ebuild new file mode 100644 index 000000000000..3ae1e1c8d095 --- /dev/null +++ b/dev-qt/qtcore/qtcore-5.6.2-r1.ebuild @@ -0,0 +1,43 @@ +# Copyright 1999-2016 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=6 +QT5_MODULE="qtbase" +inherit qt5-build + +DESCRIPTION="Cross-platform application development framework" + +if [[ ${QT5_BUILD_TYPE} == release ]]; then + KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ppc ~ppc64 ~x86" +fi + +IUSE="icu systemd" + +DEPEND=" + dev-libs/glib:2 + >=dev-libs/libpcre-8.38[pcre16,unicode] + >=sys-libs/zlib-1.2.5 + virtual/libiconv + icu? ( dev-libs/icu:= ) + systemd? ( sys-apps/systemd:= ) +" +RDEPEND="${DEPEND}" + +PATCHES=( "${FILESDIR}/${P}-plugins.patch" ) + +QT5_TARGET_SUBDIRS=( + src/tools/bootstrap + src/tools/moc + src/tools/rcc + src/corelib + src/tools/qlalr +) + +src_configure() { + local myconf=( + $(qt_use icu) + $(qt_use systemd journald) + ) + qt5-build_src_configure +} -- cgit v1.2.3-65-gdbad