Skip to content

Fix UB in LinkedHashMap::clear()#47

Merged
djc merged 1 commit into
mainfrom
fix-ub
Jun 5, 2026
Merged

Fix UB in LinkedHashMap::clear()#47
djc merged 1 commit into
mainfrom
fix-ub

Conversation

@djc

@djc djc commented Jun 5, 2026

Copy link
Copy Markdown
Owner

Fixes #43.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes unsound panic-unwind behavior in LinkedHashMap::clear() (Issue #43) by ensuring the value-list guard is left in a consistent empty state even if dropping an entry panics, and adds a regression test to cover the scenario where clear() panics and the panic is caught.

Changes:

  • Make drop_value_nodes detach the guard from the value list before dropping any nodes, preventing stale moved-out nodes from remaining reachable after a caught panic.
  • Adjust node/entry drop ordering so that, if an entry’s Drop panics, unwinding continues from the next node without revisiting the already-taken entry.
  • Add a regression test that catches a panic from clear() and then drops the map to ensure no stale nodes are traversed/dropped again.

Reviewed changes

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

File Description
src/linked_hash_map.rs Refactors drop_value_nodes to detach the guard first and to be panic-unwind safe during entry drops.
tests/linked_hash_map.rs Adds a regression test that catches a panic during clear() and validates the map can be safely dropped afterward.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@djc djc merged commit 0b55034 into main Jun 5, 2026
12 checks passed
@djc djc changed the title Fix UB when in LinkedHashMap::clear() Fix UB in LinkedHashMap::clear() Jun 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

clear() is not panic-safe

2 participants