From: Gunnar Beutner Date: Fri, 9 May 2014 12:45:59 +0000 (+0200) Subject: Fix deadlock when calling functions recursively. X-Git-Tag: v0.0.11~55 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd8ccec2586ce4750a8cb529140b745b26ed9315;p=icinga2 Fix deadlock when calling functions recursively. Fixes #6178 --- diff --git a/lib/config/aexpression.cpp b/lib/config/aexpression.cpp index 523c039c5..01d19b17b 100644 --- a/lib/config/aexpression.cpp +++ b/lib/config/aexpression.cpp @@ -263,8 +263,9 @@ Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr Array::Ptr arr = expr->EvaluateOperand2(locals); std::vector arguments; - ObjectLock olock(arr); - BOOST_FOREACH(const AExpression::Ptr& aexpr, arr) { + int index = 0; + for (int index = 0; index < arr->GetLength(); index++) { + const AExpression::Ptr& aexpr = arr->Get(index); arguments.push_back(aexpr->Evaluate(locals)); } @@ -277,8 +278,9 @@ Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& local Array::Ptr result = make_shared(); if (arr) { - ObjectLock olock(arr); - BOOST_FOREACH(const AExpression::Ptr& aexpr, arr) { + int index = 0; + for (int index = 0; index < arr->GetLength(); index++) { + const AExpression::Ptr& aexpr = arr->Get(index); result->Add(aexpr->Evaluate(locals)); } } @@ -295,8 +297,9 @@ Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals result->Set("__parent", locals); if (arr) { - ObjectLock olock(arr); - BOOST_FOREACH(const AExpression::Ptr& aexpr, arr) { + int index = 0; + for (int index = 0; index < arr->GetLength(); index++) { + const AExpression::Ptr& aexpr = arr->Get(index); Dictionary::Ptr alocals = in_place ? locals : result; aexpr->Evaluate(alocals);