RUSTSEC-2026-0301

Source
https://rustsec.org/advisories/RUSTSEC-2026-0301
Import Source
https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0301.json
JSON Data
https://api.osv.dev/v1/vulns/RUSTSEC-2026-0301
Published
2026-09-22T12:00:00Z
Modified
2026-09-22T21:00:02Z
Summary
Double free in `StackVec::retain` when a predicate or element `Drop` panics
Details

Summary

StackVec::retain committed its new length to self.len only after its internal loop completed. If the retain predicate or a removed element's Drop implementation panicked before the loop finished, unwinding proceeded with self.len still equal to the original, pre-retain length, leaving either a duplicated or already-destroyed element inside 0..len. StackVec's own Drop then revisited that slot, causing a double-drop (and for heap-owning types, a double-free).

Impact

Affects StackVec<T, CAP>::retain for T: Drop types where the predicate or the removed element's destructor can panic, on builds with unwinding enabled (panic = "unwind"). no_std/panic = "abort" builds cannot trigger this, since unwinding never occurs.

Patch

Fixed in 0.3.3 using an unwind-safe backshift guard, matching the approach alloc::vec::Vec::retain uses.

Database specific
{
    "license":  "CC0-1.0"
}
References

Affected packages

crates.io / stack_collections

Package

Name
stack_collections
View open source insights on deps.dev
Purl
pkg:cargo/stack_collections

Affected ranges

Type
SEMVER
Events
Introduced
0.3.0
Fixed
0.3.3

Ecosystem specific

{
    "affected_functions":  null,
    "affects":  {
        "arch":  [],
        "functions":  [],
        "os":  []
    }
}

Database specific

categories
[
    "memory-corruption"
]
cvss
null
informational
null
source
"https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0301.json"