- Reported
-
- Issued
-
- Package
-
zstd-safe
(crates.io)
- Type
-
INFO
Unsound
- Categories
-
- Keywords
-
#use-after-free
#zstdmt
#dictionary
- References
-
- Patched
-
- Affected Functions
- Version
zstd_safe::CCtx::disable_dictionary
-
zstd_safe::CCtx::init
-
zstd_safe::CCtx::load_dictionary
-
zstd_safe::CCtx::ref_cdict
-
zstd_safe::CCtx::ref_prefix
-
zstd_safe::CCtx::reset
-
zstd_safe::CCtx::set_parameter
-
Description
When a multithreaded frame (zstdmt feature, CParameter::NbWorkers) is
left unfinished, its jobs may still be running on the worker threads: the C
library only waits for them when the next frame starts, or when the context
is freed. A session reset makes the context accept changes again in the
meantime, so:
- unloading the dictionary (
load_dictionary, ref_cdict, ref_prefix,
disable_dictionary, init*, or reset with parameters) freed the
dictionary a worker was still compressing against;
- changing
NbWorkers made the next frame resize the job table before
waiting for the old jobs.
The flaw was corrected by refusing these calls while a multithreaded frame
is unfinished. The new CCtx::wait_for_workers() waits for the workers
first.
Advisory available under CC0-1.0
license.