diff options
author | David Faure <david.faure@kdab.com> | 2017-10-08 21:20:24 +0200 |
---|---|---|
committer | David Faure <david.faure@kdab.com> | 2017-11-30 12:54:43 +0000 |
commit | 916266a7b3538c3d31abe245ee84e691934fab40 (patch) | |
tree | 272d3ab9561c91bfa9c43089a1aa872d9c87a886 /src/corelib/mimetypes/qmimedatabase.cpp | |
parent | 2c062546a21edc68ded82b7b852df3c993d332e0 (diff) |
QMimeDatabase: ensure mutex is locked in provider()
This wasn't the case when called from QMimeType, or some
QMimeDatabase methods. Now fixed.
Change-Id: Ifd515c1520482e4a23c399f1f773269659c92359
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/mimetypes/qmimedatabase.cpp')
-rw-r--r-- | src/corelib/mimetypes/qmimedatabase.cpp | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp index 687f0b3e03..ed8bad0d83 100644 --- a/src/corelib/mimetypes/qmimedatabase.cpp +++ b/src/corelib/mimetypes/qmimedatabase.cpp @@ -81,6 +81,7 @@ QMimeDatabasePrivate::~QMimeDatabasePrivate() QMimeProviderBase *QMimeDatabasePrivate::provider() { + Q_ASSERT(!mutex.tryLock()); // caller should have locked mutex if (!m_provider) { QMimeProviderBase *binaryProvider = new QMimeBinaryProvider(this); if (binaryProvider->isValid()) { @@ -93,12 +94,6 @@ QMimeProviderBase *QMimeDatabasePrivate::provider() return m_provider; } -void QMimeDatabasePrivate::setProvider(QMimeProviderBase *theProvider) -{ - delete m_provider; - m_provider = theProvider; -} - /*! \internal Returns a MIME type or an invalid one if none found @@ -118,6 +113,47 @@ QStringList QMimeDatabasePrivate::mimeTypeForFileName(const QString &fileName) return matchingMimeTypes; } +QMimeGlobMatchResult QMimeDatabasePrivate::findByFileName(const QString &fileName) +{ + return provider()->findByFileName(fileName); +} + +void QMimeDatabasePrivate::loadMimeTypePrivate(QMimeTypePrivate &mimePrivate) +{ + QMutexLocker locker(&mutex); + provider()->loadMimeTypePrivate(mimePrivate); +} + +void QMimeDatabasePrivate::loadGenericIcon(QMimeTypePrivate &mimePrivate) +{ + QMutexLocker locker(&mutex); + provider()->loadGenericIcon(mimePrivate); +} + +void QMimeDatabasePrivate::loadIcon(QMimeTypePrivate &mimePrivate) +{ + QMutexLocker locker(&mutex); + provider()->loadIcon(mimePrivate); +} + +QStringList QMimeDatabasePrivate::parents(const QString &mimeName) +{ + QMutexLocker locker(&mutex); + return provider()->parents(mimeName); +} + +QStringList QMimeDatabasePrivate::listAliases(const QString &mimeName) +{ + QMutexLocker locker(&mutex); + return provider()->listAliases(mimeName); +} + +bool QMimeDatabasePrivate::mimeInherits(const QString &mime, const QString &parent) +{ + QMutexLocker locker(&mutex); + return inherits(mime, parent); +} + static inline bool isTextFile(const QByteArray &data) { // UTF16 byte order marks @@ -460,7 +496,7 @@ QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) co QString QMimeDatabase::suffixForFileName(const QString &fileName) const { QMutexLocker locker(&d->mutex); - return d->provider()->findByFileName(QFileInfo(fileName).fileName()).m_foundSuffix; + return d->findByFileName(QFileInfo(fileName).fileName()).m_foundSuffix; } /*! @@ -550,6 +586,7 @@ QMimeType QMimeDatabase::mimeTypeForUrl(const QUrl &url) const */ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const { + QMutexLocker locker(&d->mutex); int accuracy = 0; const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly); const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device, &accuracy); @@ -576,6 +613,7 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIO */ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const { + QMutexLocker locker(&d->mutex); QBuffer buffer(const_cast<QByteArray *>(&data)); buffer.open(QIODevice::ReadOnly); int accuracy = 0; |