From 3f078553f986217a00dccd769953f60e94d3969a Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Wed, 4 Nov 2015 13:18:48 +0100 Subject: [PATCH] fixed leaks --- arangod/Aql/Expression.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/arangod/Aql/Expression.cpp b/arangod/Aql/Expression.cpp index 3cbc4daad9..9665183861 100644 --- a/arangod/Aql/Expression.cpp +++ b/arangod/Aql/Expression.cpp @@ -1314,25 +1314,39 @@ AqlValue Expression::executeSimpleExpressionArithmetic (AstNode const* node, std::vector const& vars, std::vector const& regs) { TRI_document_collection_t const* leftCollection = nullptr; - AqlValue lhs = executeSimpleExpression(node->getMember(0), &leftCollection, trx, argv, startPos, vars, regs, true); + AqlValue lhs = executeSimpleExpression(node->getMember(0), &leftCollection, trx, argv, startPos, vars, regs, true); + + if (lhs.isObject()) { + lhs.destroy(); + return AqlValue(new Json(Json::Null)); + } + TRI_document_collection_t const* rightCollection = nullptr; AqlValue rhs = executeSimpleExpression(node->getMember(1), &rightCollection, trx, argv, startPos, vars, regs, true); - if (lhs.isObject() || - rhs.isObject()){ + if (rhs.isObject()) { + lhs.destroy(); + rhs.destroy(); return AqlValue(new Json(Json::Null)); } // TODO Optimize. Right now we always use double precission bool failed = false; double l = lhs.toNumber(failed); + lhs.destroy(); + if (failed) { + rhs.destroy(); return AqlValue(new Json(Json::Null)); } + double r = rhs.toNumber(failed); + rhs.destroy(); + if (failed) { return AqlValue(new Json(Json::Null)); } + switch (node->type) { case NODE_TYPE_OPERATOR_BINARY_PLUS: return AqlValue(new Json(l + r));