{"id":"RUSTSEC-2026-0253","aliases":[],"status":"published","title":"Potential use-after-free due to lack of panic safety in `LruCache::pop()`","description":"`LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.\n\nA subsequent cache operation that triggers eviction can then dereference these dangling pointers:\n- The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call\n- When a new insertion causes eviction, the LRU traversal encounters the dangling pointer\n- This results in a write to already-freed memory during the eviction process\n\n## Impact\n\n- **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list\n- **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times\n\nBoth types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.\n\n## Fix\n\nFixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).","facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"published":"2026-05-12T12:00:00Z","modified":"2026-08-11T11:15:06Z","fixes":[{"ecosystem":"crates.io","package":"lru","fixed_in":["0.18.2"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"crates.io","package":"lru","ranges":[{"type":"SEMVER","events":[{"introduced":"0.0.0-0"},{"fixed":"0.18.2"}]}]}],"references":[{"url":"https://crates.io/crates/lru","tags":["package"]},{"url":"https://rustsec.org/advisories/RUSTSEC-2026-0253.html","tags":["advisory"]},{"url":"https://github.com/jeromefroe/lru-rs/pull/238","tags":["web"]}],"sources":{"osv":[{"id":"RUSTSEC-2026-0253","title":"Potential use-after-free due to lack of panic safety in `LruCache::pop()`","description":"`LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.\n\nA subsequent cache operation that triggers eviction can then dereference these dangling pointers:\n- The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call\n- When a new insertion causes eviction, the LRU traversal encounters the dangling pointer\n- This results in a write to already-freed memory during the eviction process\n\n## Impact\n\n- **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list\n- **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times\n\nBoth types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.\n\n## Fix\n\nFixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).","status":"published","published":"2026-05-12T12:00:00Z","modified":"2026-08-11T11:15:06.101553049Z","updated_at":"2026-11-02T15:53:40.430679Z"}]}}
