summaryrefslogtreecommitdiffstats
path: root/src/corelib/mimetypes/qmimedatabase.cpp
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2017-10-08 21:20:24 +0200
committerDavid Faure <david.faure@kdab.com>2017-11-30 12:54:43 +0000
commit916266a7b3538c3d31abe245ee84e691934fab40 (patch)
tree272d3ab9561c91bfa9c43089a1aa872d9c87a886 /src/corelib/mimetypes/qmimedatabase.cpp
parent2c062546a21edc68ded82b7b852df3c993d332e0 (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.cpp52
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;