Skip to content

Commit

Permalink
dev-qt/qtcore: backport patch from upstream that resolves various cra…
Browse files Browse the repository at this point in the history
…shes

Gentoo-bug: 581068

Package-Manager: portage-2.3.2
  • Loading branch information
kensington committed Nov 17, 2016
1 parent 6f7203d commit 5ebe88c
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 0 deletions.
81 changes: 81 additions & 0 deletions dev-qt/qtcore/files/qtcore-5.6.2-plugins.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
From ca4d93d85ee446c5e30ec8e7814651e45cbf1218 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <[email protected]>
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 <[email protected]>
---
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

43 changes: 43 additions & 0 deletions dev-qt/qtcore/qtcore-5.6.2-r1.ebuild
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 5ebe88c

Please sign in to comment.