summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-11-05 11:47:11 +0100
committerhjk <hjk121@nokiamail.com>2014-11-05 12:30:46 +0100
commit1c12b30bef32948171ebc2dc4744fb4ecfed7e23 (patch)
tree73fcb64f318bf95f8cc3d8bad1c47ae1fcaf1353
parent2d7af0d732b3ae6d99c4be361d73a594b57f8145 (diff)
downloadqt-creator-1c12b30bef32948171ebc2dc4744fb4ecfed7e23.tar.gz
Prevent indefinite recursion in macro expansion
Task-number: QTCREATORBUG-13315 Change-Id: Ibf963569bdebf8a791f0a7ceb8cd010efed99dad Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
-rw-r--r--src/libs/utils/macroexpander.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libs/utils/macroexpander.cpp b/src/libs/utils/macroexpander.cpp
index 3bb42e652d..41cf66bf65 100644
--- a/src/libs/utils/macroexpander.cpp
+++ b/src/libs/utils/macroexpander.cpp
@@ -29,6 +29,7 @@
****************************************************************************/
#include "macroexpander.h"
+#include "qtcassert.h"
#include "qtcprocess.h"
#include "algorithm.h"
@@ -49,7 +50,7 @@ const char kFileBaseNamePostfix[] = ":FileBaseName";
class MacroExpanderPrivate : public AbstractMacroExpander
{
public:
- MacroExpanderPrivate() : m_accumulating(false) {}
+ MacroExpanderPrivate() : m_accumulating(false), m_lockDepth(0) {}
bool resolveMacro(const QString &name, QString *ret)
{
@@ -108,6 +109,8 @@ public:
QVector<MacroExpanderProvider> m_subProviders;
QVector<MacroExpander *> m_subExpanders; // Not owned
bool m_accumulating;
+
+ int m_lockDepth;
};
} // Internal
@@ -261,8 +264,16 @@ QString MacroExpander::value(const QByteArray &variable, bool *found) const
*/
QString MacroExpander::expand(const QString &stringWithVariables) const
{
+ if (d->m_lockDepth > 3) // Limit recursion.
+ return QString();
+
+ ++d->m_lockDepth;
+
QString res = stringWithVariables;
Utils::expandMacros(&res, d);
+
+ --d->m_lockDepth;
+
return res;
}