From bd6df18cfd9fd3f01208dcefecee87ace6a9d28b Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Tue, 29 Apr 2025 09:18:26 +0000 Subject: [PATCH] Revert "ANDROID: ashmem: use strncpy_from_user in set_name" This reverts commit ba971cd36a98c0e5cd51d531e5d7d306a0ebae78. Bug: 414339114 Change-Id: If44d5a7516c7dfdda68272f629ce30d74c84694f Signed-off-by: Alice Ryhl --- drivers/staging/android/ashmem_rust.rs | 17 +++++++++-------- rust/kernel/uaccess.rs | 13 ------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/drivers/staging/android/ashmem_rust.rs b/drivers/staging/android/ashmem_rust.rs index de64200442b4..e9238d5b87fe 100644 --- a/drivers/staging/android/ashmem_rust.rs +++ b/drivers/staging/android/ashmem_rust.rs @@ -297,16 +297,17 @@ impl MiscDevice for Ashmem { } impl Ashmem { - fn set_name(&self, reader: UserSliceReader) -> Result { + fn set_name(&self, mut reader: UserSliceReader) -> Result { let mut local_name = [0u8; ASHMEM_NAME_LEN]; - let mut len = reader.strncpy_from_user(&mut local_name)?; + reader.read_slice(&mut local_name)?; - // If the zero terminator is missing, the string is truncated to `ASHMEM_NAME_LEN-1` so - // that `get_name` can return it and has enough space to add a zero terminator. - if len == ASHMEM_NAME_LEN { - len -= 1; - local_name[len] = 0; - } + // Find the zero terminator. If the zero terminator is missing, the string is truncated to + // `ASHMEM_NAME_LEN-1` so that `get_name` can return it and has enough space to add a zero + // terminator. + let len = local_name + .iter() + .position(|&c| c == 0) + .unwrap_or(local_name.len() - 1); let mut v = KVec::with_capacity(len, GFP_KERNEL)?; v.extend_from_slice(&local_name[..len], GFP_KERNEL)?; diff --git a/rust/kernel/uaccess.rs b/rust/kernel/uaccess.rs index d9dda16021e7..7e059b00645a 100644 --- a/rust/kernel/uaccess.rs +++ b/rust/kernel/uaccess.rs @@ -294,19 +294,6 @@ impl UserSliceReader { unsafe { buf.inc_len(len) }; Ok(()) } - - /// Reads a nul-terminated string into the provided buffer and returns the length. - pub fn strncpy_from_user(self, buf: &mut [u8]) -> Result { - let max = usize::min(self.length, buf.len()) as isize; - // SAFETY: `buf` is valid for writing `buf.len()` bytes. - let res = - unsafe { bindings::strncpy_from_user(buf.as_mut_ptr(), self.ptr as *const u8, max) }; - if res >= 0 { - Ok(res as usize) - } else { - Err(Error::from_errno(res as i32)) - } - } } /// A writer for [`UserSlice`].