[PATCH v5 0/2] strncpy_from_user for Rust

From: Alice Ryhl
Date: Mon Jun 16 2025 - 08:42:16 EST


There is currently no easy way to read NUL-terminated strings from
userspace. Trying to use the ordinary read function on an array of the
maximum length doesn't work because it could fail with EFAULT when the C
string is shorter than the maximum length. In this case,
strncpy_from_user is better because it doesn't return EFAULT even if it
encounters a page fault on bytes that are after the NUL-terminator but
before the maximum length.

I don't see a clear owner of uaccess in MAINTAINERS, so I suggest that
it lands through Miguel's tree.

Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
---
Changes in v5:
- Add comment about not updating self.length.
- Add `` in "This implies that len == buf.len()."
- Update guarantees for raw_strncpy_from_user.
- Add Reviewed-by for Benno.
- Link to v4: https://lore.kernel.org/r/20250527-strncpy-from-user-v4-0-82168470d472@xxxxxxxxxx

Changes in v4:
- Swap order of arguments to raw_strncpy_from_user, and rename buf to
dst.
- Update safety comment on CStr::from_bytes_with_nul_unchecked.
- Add `` in "This implies that len == dst.len() < buf.len()."
- Pick up Reviewed-by tags.
- Link to v3: https://lore.kernel.org/r/20250505-strncpy-from-user-v3-0-85c677fd4f91@xxxxxxxxxx

Changes in v3:
- Remove pub from raw_strncpy_from_user.
- Mention that some data may have been copied on EFAULT.
- Add more comments to strcpy_into_buf about tricky cases.
- Rewrite documentation of strcpy_into_buf.
- Add documentation alias.
- Pick up Reviewed-by tags.
- Link to v2: https://lore.kernel.org/r/20250429-strncpy-from-user-v2-0-7e6facac0bf0@xxxxxxxxxx

Changes in v2:
- Rename the raw wrapper around strncpy_from_user to raw_strncpy_from_user.
- Add a more convenient helper on top that adds the missing
NUL-terminator when necessary.
- Link to v1: https://lore.kernel.org/r/20250424-strncpy-from-user-v1-1-f983fe21685a@xxxxxxxxxx

---
Alice Ryhl (2):
uaccess: rust: add strncpy_from_user
uaccess: rust: add UserSliceReader::strcpy_into_buf

rust/kernel/uaccess.rs | 94 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 93 insertions(+), 1 deletion(-)
---
base-commit: 19272b37aa4f83ca52bdf9c16d5d81bdd1354494
change-id: 20250424-strncpy-from-user-1f2d06b0cdde

Best regards,
--
Alice Ryhl <aliceryhl@xxxxxxxxxx>