RUSTSEC-2026-0411

Source
https://rustsec.org/advisories/RUSTSEC-2026-0411
Import Source
https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0411.json
JSON Data
https://api.osv.dev/v1/vulns/RUSTSEC-2026-0411
Published
2026-10-22T12:00:00Z
Modified
2026-10-26T14:00:05Z
Summary
Out-of-bounds read in `Log2Cache::nlog2n()`, `nlog2n_difference()` and `plog2p()`
Details

Log2Cache::new(n) fills its three tables with entries for 0..=n, but the three accessor methods index those tables with get_unchecked on a value the caller supplies. Nothing bounds the argument and nothing documents a bound, so any value above the n the cache was built with reads past the end of the vector. CountType is u32, so the read can land up to u32::MAX elements away, and plog2p() returns the value it read, disclosing whatever lies there.

For example, Log2Cache::new(4) builds tables holding 5 entries (indices 0,1,2,3,4). Then cache.nlog2n(60000) reads index 60000, far outside the allocation. Under AddressSanitizer this faults with SEGV; Miri reports it as undefined behavior at src/log2cache.rs:42.

nlog2n_difference() is off by one further: in the affected versions new(n) pushes n entries into that table rather than n + 1, so even nlog2n_difference(n) is out of bounds.

This can be triggered through safe public APIs — Log2Cache::new() and any of nlog2n(), nlog2n_difference() and plog2p() — with no unsafe required from the caller.

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

Affected packages

crates.io / dahl-salso

Package

Name
dahl-salso
View open source insights on deps.dev
Purl
pkg:cargo/dahl-salso

Affected ranges

Type
SEMVER
Events
Introduced
0.0.0-0
Fixed
0.7.0

Ecosystem specific

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

Database specific

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