diff --git a/src/plugins/coreplugin/mimedatabase.cpp b/src/plugins/coreplugin/mimedatabase.cpp
index 646a0b4971a38c73bda6f0cc8718b6858e6e101b..b20dfecbf799fee809779611f524ff8d6f824e55 100644
--- a/src/plugins/coreplugin/mimedatabase.cpp
+++ b/src/plugins/coreplugin/mimedatabase.cpp
@@ -93,6 +93,9 @@ enum { BinaryMatchPriority = 1, TextMatchPriority = 2};
 */
 
 namespace Core {
+
+typedef QSharedPointer<MagicRuleMatcher> MagicRuleMatcherPtr;
+
 namespace Internal {
 
 // FileMatchContext: Passed on to the mimetypes from the database
@@ -213,7 +216,10 @@ bool MagicRule::matches(const QByteArray &data) const
         return data.startsWith(m_pattern);
     // Range
     const int index = data.indexOf(m_pattern, m_startPos);
-    return index != -1 && index < m_endPos;
+    const bool rc = index != -1 && index < m_endPos;
+    if (debugMimeDB)
+        qDebug() << "Checking " << m_pattern << m_startPos << m_endPos << " returns " << rc;
+    return rc;
 }
 
 MagicRule *MagicRule::createStringRule(const QString &c, int startPos, int endPos)
@@ -657,7 +663,7 @@ static bool parseNumber(const QString &n, int *target, QString *errorMessage)
 //  <match value="must be converted with BinHex" type="string" offset="11"/>
 //  <match value="0x9501" type="big16" offset="0:64"/>
 static bool addMagicMatchRule(const QXmlStreamAttributes &atts,
-                              MagicRuleMatcher *ruleMatcher,
+                              const MagicRuleMatcherPtr  &ruleMatcher,
                               QString *errorMessage)
 {
     const QString type = atts.value(QLatin1String(matchTypeAttributeC)).toString();
@@ -687,8 +693,7 @@ static bool addMagicMatchRule(const QXmlStreamAttributes &atts,
 bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString *errorMessage)
 {
     MimeTypeData data;
-    MagicRuleMatcher *ruleMatcher = 0;
-
+    MagicRuleMatcherPtr ruleMatcher;
     QXmlStreamReader reader(dev);
     ParseStage ps = ParseBeginning;
     while (!reader.atEnd()) {
@@ -739,11 +744,12 @@ bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString
                         return false;
 
                 }
-                ruleMatcher = new MagicRuleMatcher;
+                ruleMatcher = MagicRuleMatcherPtr(new MagicRuleMatcher);
                 ruleMatcher->setPriority(priority);
             }
                 break;
             case ParseMagicMatchRule:
+                QTC_ASSERT(!ruleMatcher.isNull(), return false)
                 if (!addMagicMatchRule(reader.attributes(), ruleMatcher, errorMessage))
                     return false;
                 break;
@@ -762,9 +768,10 @@ bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString
                 data.clear();
             } else {
                 // Finished a match sequence
-                if (reader.name() == QLatin1String(QLatin1String(magicTagC))) {
-                    data.magicMatchers.push_back(QSharedPointer<IMagicMatcher>(ruleMatcher));
-                    ruleMatcher = 0;
+                if (reader.name() == QLatin1String(magicTagC)) {
+                    QTC_ASSERT(!ruleMatcher.isNull(), return false)
+                    data.magicMatchers.push_back(ruleMatcher);
+                    ruleMatcher = MagicRuleMatcherPtr();
                 }
             }
             break;