From d65e9bd8e4641d198db25526546eff96f3667f7f Mon Sep 17 00:00:00 2001 From: Douglas RAILLARD Date: Mon, 8 Apr 2019 18:13:12 +0100 Subject: [PATCH] exekall: Fix wrong ExprData sharing ExprData is supposed to be different for each expression, but ended up being shared. Make sure it is not by cloning the expressions. --- tools/exekall/exekall/engine.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tools/exekall/exekall/engine.py b/tools/exekall/exekall/engine.py index 12c53dacc..9975a691d 100644 --- a/tools/exekall/exekall/engine.py +++ b/tools/exekall/exekall/engine.py @@ -1250,17 +1250,25 @@ class ComputableExpression(ExpressionBase): return expr - def _fill_expr_data(self, data): + def _clone_expr_data(self, data): + # Make sure that ExprDataOperator expressions are cloned, so we don't + # end up sharing the ExprData between different expressions. if isinstance(self.op, ExprDataOperator): - self.op = ExprDataOperator(data) - for param_expr in self.param_map.values(): - param_expr._fill_expr_data(data) + expr = ComputableExpression(ExprDataOperator(data), {}) + else: + expr = self + + self.param_map = OrderedDict( + (param, param_expr._clone_expr_data(data)) + for param, param_expr in expr.param_map.items() + ) + return expr def prepare_execute(self): # Make sure the Expressions referencing their Consumer get # appropriately cloned. self._clone_consumer([]) - self._fill_expr_data(self.data) + self._clone_expr_data(self.data) return self def execute(self, post_compute_cb=None): -- GitLab