From 247cc7013a0bd48fa237842da7c3592b77137767 Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Thu, 19 Feb 2026 02:46:53 +0300 Subject: [PATCH] libexpr: Use temporary value in ExprOpUpdate::eval --- src/libexpr/eval.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index b8ed0a6aa..ba52e813b 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1987,11 +1987,15 @@ void ExprOpUpdate::eval(EvalState & state, Env & env, Value & v) UpdateQueue q; evalForUpdate(state, env, q); - v.mkAttrs(&Bindings::emptyBindings); + Value vTmp; + vTmp.mkAttrs(&Bindings::emptyBindings); + for (auto & rhs : std::views::reverse(q)) { /* Remember that queue is sorted rightmost attrset first. */ - eval(state, /*v=*/v, /*v1=*/v, /*v2=*/rhs); + eval(state, /*v=*/vTmp, /*v1=*/vTmp, /*v2=*/rhs); } + + v = vTmp; } void Expr::evalForUpdate(EvalState & state, Env & env, UpdateQueue & q, std::string_view errorCtx)