From be23ab5bd3ac953a0de50aeef6569ee783982d81 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 24 May 2026 14:04:01 +0300 Subject: fix(rpn): restore stack values in popAll on partial failure (lj) If stack.Pop() errors midway through the loop, already-popped values are pushed back in reverse order before returning the error, preventing stack corruption from concurrent modification or unexpected failures. --- internal/rpn/operations_helpers.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'internal') diff --git a/internal/rpn/operations_helpers.go b/internal/rpn/operations_helpers.go index afdfa0e..03c0bb1 100644 --- a/internal/rpn/operations_helpers.go +++ b/internal/rpn/operations_helpers.go @@ -79,6 +79,10 @@ func popAll(stack *Stack, op string) ([]StackValue, error) { for stack.Len() > 0 { val, err := stack.Pop() if err != nil { + // Restore already-popped values in reverse order (top of stack first). + for i := len(values) - 1; i >= 0; i-- { + stack.Push(values[i]) + } return nil, fmt.Errorf("%s: failed to pop: %w", op, err) } values = append(values, val) -- cgit v1.2.3