forked from qt-creator/qt-creator
		
	Mime database: Fix potential memory leak.
Uncovered by code scanning.
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user