QMimeProvider: Do not crash when globPatterns is empty.

Change-Id: I351a533a1f03ac2e7bdec876b657a80fac60b2ed
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
This commit is contained in:
Milian Wolff 2015-07-13 15:42:35 +02:00 committed by David Faure
parent a47cd2cc82
commit af3152adee
5 changed files with 24 additions and 1 deletions

View File

@ -624,7 +624,7 @@ void QMimeBinaryProvider::loadMimeTypePrivate(QMimeTypePrivate &data)
// Let's assume that shared-mime-info is at least version 0.70
// Otherwise we would need 1) a version check, and 2) code for parsing patterns from the globs file.
#if 1
if (!mainPattern.isEmpty() && data.globPatterns.first() != mainPattern) {
if (!mainPattern.isEmpty() && (data.globPatterns.isEmpty() || data.globPatterns.first() != mainPattern)) {
// ensure it's first in the list of patterns
data.globPatterns.removeAll(mainPattern);
data.globPatterns.prepend(mainPattern);

View File

@ -2,6 +2,7 @@
<qresource prefix="/qt-project.org/qmime">
<file alias="yast2-metapackage-handler-mimetypes.xml">yast2-metapackage-handler-mimetypes.xml</file>
<file alias="qml-again.xml">qml-again.xml</file>
<file alias="text-x-objcsrc.xml">text-x-objcsrc.xml</file>
<file alias="test.qml">test.qml</file>
</qresource>
</RCC>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="text/x-objcsrc">
<comment>Objective-C source code</comment>
<glob-deleteall/>
</mime-type>
</mime-info>

View File

@ -47,6 +47,7 @@
static const char yastFileName[] ="yast2-metapackage-handler-mimetypes.xml";
static const char qmlAgainFileName[] ="qml-again.xml";
static const char textXObjCSrcFileName[] ="text-x-objcsrc.xml";
#define RESOURCE_PREFIX ":/qt-project.org/qmime/"
void initializeLang()
@ -152,6 +153,8 @@ void tst_QMimeDatabase::initTestCase()
QVERIFY2(QFile::exists(m_yastMimeTypes), qPrintable(errorMessage.arg(yastFileName)));
m_qmlAgainFileName = QLatin1String(RESOURCE_PREFIX) + qmlAgainFileName;
QVERIFY2(QFile::exists(m_qmlAgainFileName), qPrintable(errorMessage.arg(qmlAgainFileName)));
m_textXObjCSrcFileName = QLatin1String(RESOURCE_PREFIX) + textXObjCSrcFileName;
QVERIFY2(QFile::exists(m_textXObjCSrcFileName), qPrintable(errorMessage.arg(textXObjCSrcFileName)));
initTestCaseInternal();
m_isUsingCacheProvider = !qEnvironmentVariableIsSet("QT_NO_MIME_CACHE");
@ -880,6 +883,8 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
QFile::remove(destFile);
const QString destQmlFile = destDir + QLatin1String(qmlAgainFileName);
QFile::remove(destQmlFile);
const QString destTextXObjCSrcFile = destDir + QLatin1String(textXObjCSrcFileName);
QFile::remove(destTextXObjCSrcFile);
//qDebug() << destFile;
if (!QFileInfo(destDir).isDir())
@ -887,6 +892,7 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
QString errorMessage;
QVERIFY2(copyResourceFile(m_yastMimeTypes, destFile, &errorMessage), qPrintable(errorMessage));
QVERIFY2(copyResourceFile(m_qmlAgainFileName, destQmlFile, &errorMessage), qPrintable(errorMessage));
QVERIFY2(copyResourceFile(m_textXObjCSrcFileName, destTextXObjCSrcFile, &errorMessage), qPrintable(errorMessage));
if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(mimeDir))
QSKIP("shared-mime-info not found, skipping mime.cache test");
@ -903,9 +909,17 @@ void tst_QMimeDatabase::installNewGlobalMimeType()
QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(),
QString::fromLatin1("text/x-qml"));
// ensure we can access the empty glob list
{
QMimeType objcsrc = db.mimeTypeForName(QStringLiteral("text/x-objcsrc"));
QVERIFY(objcsrc.isValid());
qDebug() << objcsrc.globPatterns();
}
// Now test removing it again
QVERIFY(QFile::remove(destFile));
QVERIFY(QFile::remove(destQmlFile));
QVERIFY(QFile::remove(destTextXObjCSrcFile));
if (m_isUsingCacheProvider && !waitAndRunUpdateMimeDatabase(mimeDir))
QSKIP("shared-mime-info not found, skipping mime.cache test");
QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(),

View File

@ -94,6 +94,7 @@ private:
QString m_localMimeDir;
QString m_yastMimeTypes;
QString m_qmlAgainFileName;
QString m_textXObjCSrcFileName;
QTemporaryDir m_temporaryDir;
QString m_testSuite;
bool m_isUsingCacheProvider;