Skip to content

Fix contract restore panic when restoring a missing entry - #2660

Merged
leighmcculloch merged 2 commits into
mainfrom
restore-no-op-panic
Jul 28, 2026
Merged

Fix contract restore panic when restoring a missing entry#2660
leighmcculloch merged 2 commits into
mainfrom
restore-no-op-panic

Conversation

@leighmcculloch

@leighmcculloch leighmcculloch commented Jul 27, 2026

Copy link
Copy Markdown
Member

What

Guard stellar contract restore against the same "index out of bounds" panic that #2657 fixed in extend: the no-op path unconditionally indexed entry.entries[0], which panics if the post-transaction fetch returns no entries. It now errors with "Ledger entry not found" instead.

Why

restore carried the identical unguarded indexing as extend (see #2599), so this applies the same .first().ok_or(Error::LedgerEntryNotFound)? fix. Unlike extend, restoring a non-existent entry fails cleanly at simulation ("Missing entry to restore") before reaching the no-op path, so this guard is defensive hardening for the narrower case where the fetch after a no-op comes back empty (e.g. the entry was evicted in the meantime). The regression test asserts the non-existent-entry case fails cleanly at simulation without panicking.

Known limitations

The empty-fetch-after-no-op case itself isn't covered by an integration test since simulation catches the straightforward missing-entry scenario first.

@github-project-automation github-project-automation Bot moved this to Backlog (Not Ready) in DevX Jul 27, 2026
@leighmcculloch
leighmcculloch requested a review from fnando July 28, 2026 01:42
@leighmcculloch
leighmcculloch marked this pull request as ready for review July 28, 2026 01:42
Copilot AI review requested due to automatic review settings July 28, 2026 01:42

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Prevents contract restore from panicking when a requested ledger entry does not exist.

Changes:

  • Safely handles empty ledger-entry results with LedgerEntryNotFound.
  • Adds an integration regression test verifying clean failure without panic.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
cmd/soroban-cli/src/commands/contract/restore.rs Replaces unsafe indexing with checked access.
cmd/crates/soroban-test/tests/it/integration/hello_world.rs Tests restoration of a nonexistent entry.

@leighmcculloch
leighmcculloch enabled auto-merge (squash) July 28, 2026 03:49
@leighmcculloch
leighmcculloch merged commit 0c32ac8 into main Jul 28, 2026
229 checks passed
@leighmcculloch
leighmcculloch deleted the restore-no-op-panic branch July 28, 2026 13:44
@github-project-automation github-project-automation Bot moved this from Backlog (Not Ready) to Done in DevX Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants