forked from qt-creator/qt-creator
ProParser: Guard against OOM
When the pattern for a regular expression is empty, every character of the source is replaced with a copy of the "after" part of a "QString::replace(re, after)". If input and output are huge this results in a bad_alloc. We catch that here. Fixes: QTCREATORBUG-16957 Change-Id: If512f407a2170d93ae7e4182219d9926945b14de Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -877,10 +877,16 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProVariable(
|
|||||||
QRegularExpression regexp(pattern, case_sense ? QRegularExpression::NoPatternOption :
|
QRegularExpression regexp(pattern, case_sense ? QRegularExpression::NoPatternOption :
|
||||||
QRegularExpression::CaseInsensitiveOption);
|
QRegularExpression::CaseInsensitiveOption);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
// We could make a union of modified and unmodified values,
|
// We could make a union of modified and unmodified values,
|
||||||
// but this will break just as much as it fixes, so leave it as is.
|
// but this will break just as much as it fixes, so leave it as is.
|
||||||
replaceInList(&valuesRef(varName), regexp, replace, global, m_tmp2);
|
replaceInList(&valuesRef(varName), regexp, replace, global, m_tmp2);
|
||||||
debugMsg(2, "replaced %s with %s", dbgQStr(pattern), dbgQStr(replace));
|
debugMsg(2, "replaced %s with %s", dbgQStr(pattern), dbgQStr(replace));
|
||||||
|
} catch (const std::bad_alloc &e) {
|
||||||
|
qWarning() << "Bad alloc caught in replaceInList:" << e.what();
|
||||||
|
return ReturnError;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ProStringList varVal;
|
ProStringList varVal;
|
||||||
if (expandVariableReferences(tokPtr, sizeHint, &varVal, false) == ReturnError)
|
if (expandVariableReferences(tokPtr, sizeHint, &varVal, false) == ReturnError)
|
||||||
|
Reference in New Issue
Block a user