Don't store QLibraryPrivate with empty file names in the global store

They shouldn't exist in the first place. They exist in two cases only:
1) mistake by the user in the QLibrary or QPluginLoader constructors or
setFileName

2) as a kludge for setLoadHints before a file name is set (we need to
store the user's requested hints somewhere)

This is important for the second case, as otherwise all QLibrary and
QPluginLoader objects without a file name would share the setting.

Task-number: QTBUG-39642
Change-Id: Iebff0252fd4d95a1d54caf338d4e2fff4de3b189
Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
Thiago Macieira 2014-07-21 17:45:55 -07:00
parent cfaf851e26
commit f07c27eec1
2 changed files with 5 additions and 2 deletions

View File

@ -455,7 +455,7 @@ inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, con
lib = new QLibraryPrivate(fileName, version, loadHints); lib = new QLibraryPrivate(fileName, version, loadHints);
// track this library // track this library
if (Q_LIKELY(data)) if (Q_LIKELY(data) && !fileName.isEmpty())
data->libraryMap.insert(fileName, lib); data->libraryMap.insert(fileName, lib);
lib->libraryRefCount.ref(); lib->libraryRefCount.ref();
@ -475,7 +475,7 @@ inline void QLibraryStore::releaseLibrary(QLibraryPrivate *lib)
// no one else is using // no one else is using
Q_ASSERT(lib->libraryUnloadCount.load() == 0); Q_ASSERT(lib->libraryUnloadCount.load() == 0);
if (Q_LIKELY(data)) { if (Q_LIKELY(data) && !lib->fileName.isEmpty()) {
QLibraryPrivate *that = data->libraryMap.take(lib->fileName); QLibraryPrivate *that = data->libraryMap.take(lib->fileName);
Q_ASSERT(lib == that); Q_ASSERT(lib == that);
Q_UNUSED(that); Q_UNUSED(that);

View File

@ -456,6 +456,9 @@ void tst_QLibrary::loadHints()
if (int(loadHints) != 0) { if (int(loadHints) != 0) {
lh |= library.loadHints(); lh |= library.loadHints();
library.setLoadHints(lh); library.setLoadHints(lh);
// confirm that another QLibrary doesn't get affected - QTBUG-39642
QCOMPARE(QLibrary().loadHints(), QLibrary::LoadHints());
} }
library.setFileName(lib); library.setFileName(lib);
QCOMPARE(library.loadHints(), lh); QCOMPARE(library.loadHints(), lh);