From 5bba2e952868f4544921ae8df8569d2e8b1d7e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 8 Nov 2018 15:50:22 +0100 Subject: [PATCH] [poincare] Protect from deep recursion in Expressio::approximateToEval --- poincare/src/expression.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index a4d8b811c..f2ce0cb8a 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -243,12 +243,20 @@ void Expression::defaultSetChildrenInPlace(Expression other) { template Evaluation Expression::approximateToEvaluation(Context& context, Preferences::AngleUnit angleUnit) const { - assert(sRecursionCountReinitializationIsLocked == true); + bool willHaveToUnlock = ResetRecursionCountAndLockReset(); + IncrementRecursionCount(); + Evaluation result; if (RecursionMaximalDepthExceeded()) { - return Complex::Undefined(); // TODO Propagate error "Recursion too deep" + result = Complex::Undefined(); // TODO Propagate error "Recursion too deep" + } else { + result = node()->approximate(U(), context, angleUnit); } - return node()->approximate(U(), context, angleUnit); + + if (willHaveToUnlock) { + UnlockRecursionCountReset(); + } + return result; } Expression Expression::defaultReplaceSymbolWithExpression(const SymbolAbstract & symbol, const Expression expression) {