summaryrefslogtreecommitdiff
path: root/src/module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/module.cc')
-rw-r--r--src/module.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/module.cc b/src/module.cc
index 8b84c07..e853457 100644
--- a/src/module.cc
+++ b/src/module.cc
@@ -135,8 +135,28 @@ Module::~Module()
{
}
+class ModRecursionGuard
+{
+public:
+ ModRecursionGuard(const ModuleInstantiation &inst) : inst(inst) {
+ inst.recursioncount++;
+ }
+ ~ModRecursionGuard() {
+ inst.recursioncount--;
+ }
+ bool recursion_detected() const { return (inst.recursioncount > 100); }
+private:
+ const ModuleInstantiation &inst;
+};
+
AbstractNode *Module::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
{
+ ModRecursionGuard g(*inst);
+ if (g.recursion_detected()) {
+ PRINTB("ERROR: Recursion detected calling module '%s'", inst->name());
+ return NULL;
+ }
+
ModuleContext c(ctx, evalctx);
c.initializeModule(*this);
c.set_variable("$children", Value(double(inst->scope.children.size())));
contact: Jan Huwald // Impressum