From eb250cd18aaa5308eee12cf016bbfdd25a543da6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 18 Sep 2012 13:53:39 +0200 Subject: Add a self-reference check for target properties. Prevent constructs like: ... INCLUDE_DIRECTORIES "$" Indirect self-references (cycles) are also prevented here, but indirect generator expression references of any kind are not possible yet anyway. --- Source/cmGeneratorExpressionEvaluator.cxx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index a9e28c3..67bcc0b 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -14,6 +14,7 @@ #include "cmGeneratorExpressionEvaluator.h" #include "cmGeneratorExpressionParser.h" #include "cmGeneratorExpressionDAGChecker.h" +#include "cmGeneratorExpression.h" //---------------------------------------------------------------------------- static void reportError(cmGeneratorExpressionContext *context, @@ -264,7 +265,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode std::string Evaluate(const std::vector ¶meters, cmGeneratorExpressionContext *context, const GeneratorExpressionContent *content, - cmGeneratorExpressionDAGChecker *) const + cmGeneratorExpressionDAGChecker *dagCheckerParent + ) const { if (parameters.size() != 1 && parameters.size() != 2) { @@ -289,6 +291,19 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode } propertyName = parameters.at(1); } + + cmGeneratorExpressionDAGChecker dagChecker(context->Backtrace, + target->GetName(), + propertyName, + content, + dagCheckerParent); + + if (!dagChecker.check()) + { + dagChecker.reportError(context, content->GetOriginalExpression()); + return std::string(); + } + const char *prop = target->GetProperty(propertyName.c_str()); return prop ? prop : ""; } -- cgit v0.12