summaryrefslogtreecommitdiff
path: root/src/module.cc
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-05-22 03:04:22 (GMT)
committerMarius Kintel <marius@kintel.net>2013-05-22 03:04:22 (GMT)
commitef9d8a853be1a6d6ca48239fcc79106ba374ee21 (patch)
tree041fe3424e663a40986208e6829df5e955838e33 /src/module.cc
parent470588b296aea880c84071ee53a23f055f9c5bf0 (diff)
parent71ab237aada8db602045063f0f1c6082ef06972a (diff)
Merge branch 'master' into issue304
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