summaryrefslogtreecommitdiff
path: root/src/module.cc
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-05-13 20:27:17 (GMT)
committerMarius Kintel <marius@kintel.net>2013-05-13 20:27:17 (GMT)
commitee6f149dd0d9bcef0cb94cef154ed32f308c23e1 (patch)
tree28542d1aa602d31ffbced210bd881249242f5c5f /src/module.cc
parent8c532d525203d6cd0fc8ab200a4dea1dccd03dd6 (diff)
bugfix: Fixed recursion crash (#346)
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