Replace the explicit bounds comparisons with a single checked_add()-based range check. This avoids redundant comparisons, makes the overflow case explicit, and results in simpler generated code (checked with godbolt for x86). Option::is_none_or() would be nicer, but it requires Rust 1.82; the kernel currently targets 1.78. No functional change intended. Signed-off-by: Kari Argillander --- rust/kernel/page.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/rust/kernel/page.rs b/rust/kernel/page.rs index 432fc0297d4a..a07e6d256860 100644 --- a/rust/kernel/page.rs +++ b/rust/kernel/page.rs @@ -239,17 +239,15 @@ fn with_pointer_into_page( len: usize, f: impl FnOnce(*mut u8) -> Result, ) -> Result { - let bounds_ok = off <= PAGE_SIZE && len <= PAGE_SIZE && (off + len) <= PAGE_SIZE; - - if bounds_ok { - self.with_page_mapped(move |page_addr| { - // SAFETY: The `off` integer is at most `PAGE_SIZE`, so this pointer offset will - // result in a pointer that is in bounds or one off the end of the page. - f(unsafe { page_addr.add(off) }) - }) - } else { - Err(EINVAL) + if off.checked_add(len).map_or(true, |end| end > PAGE_SIZE) { + return Err(EINVAL); } + + self.with_page_mapped(move |page_addr| { + // SAFETY: The `off` integer is at most `PAGE_SIZE`, so this pointer offset will + // result in a pointer that is in bounds or one off the end of the page. + f(unsafe { page_addr.add(off) }) + }) } /// Maps the page and reads from it into the given buffer. --- base-commit: cc3aa43b44bdb43dfbac0fcb51c56594a11338a8 change-id: 20251219-rust-page-check-819ccc39c53a Best regards, -- Kari Argillander