QPluginLoader: report the right load hints

A default-constructed QPluginLoader erroneously reports that the
load hints are empty. However, setting a filename would then
automatically set the PreventUnload hint, surprising the user.

Return the correct flags instead.

Amends 494376f980e96339b6f1eff7c41336ca4d853065

Change-Id: I7a95964cb680afd3adf2f71ed73d2f93023238f2
Fixes: QTBUG-100416
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit e7d627339cc35907c0d5bb263ede10a017e0b988)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Giuseppe D'Angelo 2022-02-02 16:10:18 +01:00 committed by Qt Cherry-pick Bot
parent 7374e9760b
commit a633bc491f
2 changed files with 20 additions and 4 deletions

View File

@ -105,6 +105,8 @@ QT_BEGIN_NAMESPACE
\sa QLibrary, {Plug & Paint Example}
*/
static constexpr QLibrary::LoadHints defaultLoadHints = QLibrary::PreventUnloadHint;
/*!
Constructs a plugin loader with the given \a parent.
*/
@ -128,7 +130,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
: QObject(parent), d(nullptr), did_load(false)
{
setFileName(fileName);
setLoadHints(QLibrary::PreventUnloadHint);
setLoadHints(defaultLoadHints);
}
/*!
@ -329,7 +331,7 @@ static QString locatePlugin(const QString& fileName)
void QPluginLoader::setFileName(const QString &fileName)
{
#if defined(QT_SHARED)
QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;
QLibrary::LoadHints lh = defaultLoadHints;
if (d) {
lh = d->loadHints();
d->release();
@ -394,7 +396,12 @@ void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)
QLibrary::LoadHints QPluginLoader::loadHints() const
{
return d ? d->loadHints() : QLibrary::LoadHints();
// Not having a d-pointer means that the user hasn't called
// setLoadHints() / setFileName() yet. In setFileName() we will
// then force defaultLoadHints on loading, so we must return them
// from here as well.
return d ? d->loadHints() : defaultLoadHints;
}
#endif // QT_CONFIG(library)

View File

@ -245,10 +245,19 @@ void tst_QPluginLoader::loadHints()
QSKIP("This test requires Qt to create shared libraries.");
#endif
QPluginLoader loader;
QCOMPARE(loader.loadHints(), QLibrary::LoadHints{}); //Do not crash
QCOMPARE(loader.loadHints(), QLibrary::PreventUnloadHint); //Do not crash
loader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
QPluginLoader loader2;
QCOMPARE(loader2.loadHints(), QLibrary::PreventUnloadHint);
loader2.setFileName(sys_qualifiedLibraryName("theplugin"));
QCOMPARE(loader2.loadHints(), QLibrary::PreventUnloadHint);
QPluginLoader loader3(sys_qualifiedLibraryName("theplugin"));
QCOMPARE(loader3.loadHints(), QLibrary::PreventUnloadHint);
}
void tst_QPluginLoader::deleteinstanceOnUnload()