summaryrefslogtreecommitdiff
path: root/rust/zerocopy/rustdoc/git@git.tavy.me:linux-stable.git
diff options
context:
space:
mode:
authorHyunwoo Kim <imv4bel@gmail.com>2026-05-31 22:29:24 +0900
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-07-03 12:28:28 +0200
commit803c8a9502e9b97cd6ae937618ef4a8fd6274343 (patch)
treeae65b605baca8af6654fdfb1b0832762c5c10b6d /rust/zerocopy/rustdoc/git@git.tavy.me:linux-stable.git
parentf223d27a546c1e1f48d38fd67760e78f068fe8c4 (diff)
rust_binder: use a u64 stride when cleaning up the offsets array
Allocation's Drop walks the offsets array (binder_size_t = u64 entries), cleaning up the objects, but it used usize instead of u64 for both the stride and the per-entry read. On 64-bit kernels (usize == u64) this is harmless, but on 32-bit kernels it walks the 8-byte entries in 4-byte steps, iterating an N-entry array 2N times, and reads the always-zero high word as offset 0, cleaning up the object at offset 0 N extra times. As a result the referenced node or handle ends up with a lower reference count than it actually has (a refcount over-decrement), and binder's reference accounting is corrupted; for example, the owner can be notified of a strong reference release (BR_RELEASE) even though references still remain. Change the stride to u64, and read each entry as a u64, narrowing it to usize with try_into(). On 32-bit ARM, when this over-decrement would drive a count below zero, the driver's existing refcount guard refuses it and fires: rust_binder: Failure: refcount underflow! Cc: stable <stable@kernel.org> Fixes: eafedbc7c050 ("rust_binder: add Rust Binder driver") Signed-off-by: Hyunwoo Kim <imv4bel@gmail.com> Acked-by: Carlos Llamas <cmllamas@google.com> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/ahw3tFhLz9bMMJAO@v4bel Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'rust/zerocopy/rustdoc/git@git.tavy.me:linux-stable.git')
0 files changed, 0 insertions, 0 deletions