diff --git a/drivers/staging/android/ashmem_rust.rs b/drivers/staging/android/ashmem_rust.rs index 7e6506d1e8ab..a6a475d8f0e2 100644 --- a/drivers/staging/android/ashmem_rust.rs +++ b/drivers/staging/android/ashmem_rust.rs @@ -415,9 +415,12 @@ unsafe impl kernel::types::FromBytes for AshmemPin {} None => return Err(EINVAL), }; + let max_size = page_align(asma.size); + let remaining = max_size.checked_sub(offset).ok_or(EINVAL)?; + // Per custom, you can pass zero for len to mean "everything onward". let len = if cmd_len == 0 { - page_align(asma.size) - offset + remaining } else { cmd_len }; @@ -426,7 +429,7 @@ unsafe impl kernel::types::FromBytes for AshmemPin {} return Err(EINVAL); } let len_plus_offset = offset.checked_add(len).ok_or(EINVAL)?; - if page_align(asma.size) < len_plus_offset { + if max_size < len_plus_offset { return Err(EINVAL); }