Skip to content

Commit 9e5946d

Browse files
Darksonnojeda
authored andcommitted
rust: declare cfi_encoding for lru_status
By default bindgen will convert 'enum lru_status' into a typedef for an integer. For the most part, an integer of the same size as the enum results in the correct ABI, but in the specific case of CFI, that is not the case. The CFI encoding is supposed to be the same as a struct called 'lru_status' rather than the name of the underlying native integer type. To fix this, tell bindgen to generate a newtype and set the CFI type explicitly. Note that we need to set the CFI attribute explicitly as bindgen is using repr(transparent), which is otherwise identical to the inner type for ABI purposes. This allows us to remove the page range helper C function in Binder without risking a CFI failure when list_lru_walk calls the provided function pointer. The --with-attribute-custom-enum argument requires bindgen v0.71 or greater. [ In particular, the feature was added in 0.71.0 [1][2]. In addition, `feature(cfi_encoding)` has been available since Rust 1.71.0 [3]. Link: rust-lang/rust-bindgen#2520 [1] Link: rust-lang/rust-bindgen#2866 [2] Link: rust-lang/rust#105452 [3] - Miguel ] My testing procedure was to add this to the android17-6.18 branch and verify that rust_shrink_free_page is successfully called without crash, and verify that it does in fact crash when the cfi_encoding is set to other values. Note that I couldn't test this on android16-6.12 as that branch uses a bindgen version that is too old. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20260223-cfi-lru-status-v2-1-89c6448a63a4@google.com [ Rebased on top of the minimum Rust version bump series which provide the required `bindgen` version. - Miguel ] Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://patch.msgid.link/20260405235309.418950-32-ojeda@kernel.org Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
1 parent 86c5d1c commit 9e5946d

8 files changed

Lines changed: 10 additions & 45 deletions

File tree

drivers/android/binder/Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ obj-$(CONFIG_ANDROID_BINDER_IPC_RUST) += rust_binder.o
55
rust_binder-y := \
66
rust_binder_main.o \
77
rust_binderfs.o \
8-
rust_binder_events.o \
9-
page_range_helper.o
8+
rust_binder_events.o

drivers/android/binder/page_range.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -642,15 +642,15 @@ unsafe extern "C" fn rust_shrink_scan(
642642
unsafe {
643643
bindings::list_lru_walk(
644644
list_lru,
645-
Some(bindings::rust_shrink_free_page_wrap),
645+
Some(rust_shrink_free_page),
646646
ptr::null_mut(),
647647
nr_to_scan,
648648
)
649649
}
650650
}
651651

652-
const LRU_SKIP: bindings::lru_status = bindings::lru_status_LRU_SKIP;
653-
const LRU_REMOVED_ENTRY: bindings::lru_status = bindings::lru_status_LRU_REMOVED_RETRY;
652+
const LRU_SKIP: bindings::lru_status = bindings::lru_status::LRU_SKIP;
653+
const LRU_REMOVED_ENTRY: bindings::lru_status = bindings::lru_status::LRU_REMOVED_RETRY;
654654

655655
/// # Safety
656656
/// Called by the shrinker.

drivers/android/binder/page_range_helper.c

Lines changed: 0 additions & 24 deletions
This file was deleted.

drivers/android/binder/page_range_helper.h

Lines changed: 0 additions & 15 deletions
This file was deleted.

rust/bindgen_parameters

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
# warning. We don't need to peek into it anyway.
2020
--opaque-type spinlock
2121

22+
# enums that appear in indirect function calls should specify a cfi type
23+
--newtype-enum lru_status
24+
--with-attribute-custom-enum=lru_status='#[cfi_encoding="10lru_status"]'
25+
2226
# `seccomp`'s comment gets understood as a doctest
2327
--no-doc-comments
2428

rust/bindings/bindings_helper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,4 @@ const vm_flags_t RUST_CONST_HELPER_VM_NOHUGEPAGE = VM_NOHUGEPAGE;
149149
#if IS_ENABLED(CONFIG_ANDROID_BINDER_IPC_RUST)
150150
#include "../../drivers/android/binder/rust_binder.h"
151151
#include "../../drivers/android/binder/rust_binder_events.h"
152-
#include "../../drivers/android/binder/page_range_helper.h"
153152
#endif

rust/bindings/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
unreachable_pub,
2020
unsafe_op_in_unsafe_fn
2121
)]
22+
#![feature(cfi_encoding)]
2223

2324
#[allow(dead_code)]
2425
#[allow(clippy::cast_lossless)]

rust/uapi/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
unsafe_op_in_unsafe_fn
2525
)]
2626
#![cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
27+
#![feature(cfi_encoding)]
2728

2829
// Manual definition of blocklisted types.
2930
type __kernel_size_t = usize;

0 commit comments

Comments
 (0)