mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
cmask_equal(), cmask_weight() and cmask_subset() bounded their word walks
with CMASK_NR_WORDS(nr_cids), which pads by one word and can't tell the last
word in use without @base. The walks could thus cover a slack word past the
active range, which cmask_reframe() leaves non-zero: a stale bit there gave
cmask_equal() a spurious mismatch, cmask_weight() an inflated count, and
cmask_subset() a spurious violation. cmask_subset() could also read
@b->bits[] one word past its allocation (within the arena's fault-recovered
range, so harmless), and deviated from the kernel scx_cmask_subset() by
failing any @a range that doesn't nest inside @b's even when the overhanging
bits are all clear.
Bound the cmask_equal() and cmask_weight() walks by the words the range
actually spans, with early returns for empty ranges. Rewrite cmask_subset()
to match the kernel semantics: scan @a's overhangs for set bits with
cmask_next_set() and walk the words of the range intersection.
cmask_subset() moves below cmask_next_set(), which it now uses. Padding bits
don't need masking as every cmask helper keeps them clear.
Fixes:
|
||
|---|---|---|
| .. | ||
| bpf_arena_common.bpf.h | ||
| bpf_arena_common.h | ||
| cid.bpf.h | ||
| common.bpf.h | ||
| common.h | ||
| compat.bpf.h | ||
| compat.h | ||
| enum_defs.autogen.h | ||
| enums.autogen.bpf.h | ||
| enums.autogen.h | ||
| enums.bpf.h | ||
| enums.h | ||
| user_exit_info_common.h | ||
| user_exit_info.bpf.h | ||
| user_exit_info.h | ||