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:
Marcus Tillmanns
2024-02-01 13:11:14 +01:00
parent f96365194c
commit b50e77e858

View File

@@ -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)