diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-24 14:04:01 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-24 14:04:01 +0300 |
| commit | be23ab5bd3ac953a0de50aeef6569ee783982d81 (patch) | |
| tree | 8a392ea2c5578190b648e34a03579f16b49a5c95 | |
| parent | 7d754768b8d610015cdb016ecda54bbdad54fa6c (diff) | |
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.
| -rw-r--r-- | internal/rpn/operations_helpers.go | 4 |
1 files changed, 4 insertions, 0 deletions
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) |
