* [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked()
@ 2026-03-10 9:57 Albab Hasan
2026-03-10 10:03 ` Miguel Ojeda
2026-03-10 12:57 ` Alexandre Courbot
0 siblings, 2 replies; 4+ messages in thread
From: Albab Hasan @ 2026-03-10 9:57 UTC (permalink / raw)
To: rust-for-linux; +Cc: ojeda, acourbot, linux-kernel, Albab Hasan
Replace manual bounds checking followed by split_at() and split_at_mut()
calls with the checked variants split_at_checked() and
split_at_mut_checked(), which return None instead of panicking on
out-of-bounds indices.
These methods were stabilized in Rust 1.80.0, which is the current
minimum supported Rust version for the kernel.
This simplifies from_bytes_prefix(), from_bytes_mut_prefix(), and
from_bytes_copy_prefix() by removing the explicit bounds checks and
panic-avoidance comments that are no longer needed.
Signed-off-by: Albab Hasan <albabhasan276@gmail.com>
---
rust/kernel/transmute.rs | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/rust/kernel/transmute.rs b/rust/kernel/transmute.rs
index 5711580c9f9b..643b19406a24 100644
--- a/rust/kernel/transmute.rs
+++ b/rust/kernel/transmute.rs
@@ -67,16 +67,9 @@ fn from_bytes_prefix(bytes: &[u8]) -> Option<(&Self, &[u8])>
where
Self: Sized,
{
- if bytes.len() < size_of::<Self>() {
- None
- } else {
- // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at` cannot
- // panic.
- // TODO: replace with `split_at_checked` once the MSRV is >= 1.80.
- let (prefix, remainder) = bytes.split_at(size_of::<Self>());
+ let (prefix, remainder) = bytes.split_at_checked(size_of::<Self>())?;
- Self::from_bytes(prefix).map(|s| (s, remainder))
- }
+ Self::from_bytes(prefix).map(|s| (s, remainder))
}
/// Converts a mutable slice of bytes to a reference to `Self`.
@@ -110,16 +103,9 @@ fn from_bytes_mut_prefix(bytes: &mut [u8]) -> Option<(&mut Self, &mut [u8])>
where
Self: AsBytes + Sized,
{
- if bytes.len() < size_of::<Self>() {
- None
- } else {
- // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at_mut` cannot
- // panic.
- // TODO: replace with `split_at_mut_checked` once the MSRV is >= 1.80.
- let (prefix, remainder) = bytes.split_at_mut(size_of::<Self>());
+ let (prefix, remainder) = bytes.split_at_mut_checked(size_of::<Self>())?;
- Self::from_bytes_mut(prefix).map(|s| (s, remainder))
- }
+ Self::from_bytes_mut(prefix).map(|s| (s, remainder))
}
/// Creates an owned instance of `Self` by copying `bytes`.
@@ -149,16 +135,9 @@ fn from_bytes_copy_prefix(bytes: &[u8]) -> Option<(Self, &[u8])>
where
Self: Sized,
{
- if bytes.len() < size_of::<Self>() {
- None
- } else {
- // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at` cannot
- // panic.
- // TODO: replace with `split_at_checked` once the MSRV is >= 1.80.
- let (prefix, remainder) = bytes.split_at(size_of::<Self>());
+ let (prefix, remainder) = bytes.split_at_checked(size_of::<Self>())?;
- Self::from_bytes_copy(prefix).map(|s| (s, remainder))
- }
+ Self::from_bytes_copy(prefix).map(|s| (s, remainder))
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked()
2026-03-10 9:57 [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked() Albab Hasan
@ 2026-03-10 10:03 ` Miguel Ojeda
[not found] ` <CAM9eepV-3Oh8yY4JaLtiU9bbxJfA+Kf9m-yZdOuVfp-pHQ3+=Q@mail.gmail.com>
2026-03-10 12:57 ` Alexandre Courbot
1 sibling, 1 reply; 4+ messages in thread
From: Miguel Ojeda @ 2026-03-10 10:03 UTC (permalink / raw)
To: Albab Hasan; +Cc: rust-for-linux, ojeda, acourbot, linux-kernel
On Tue, Mar 10, 2026 at 10:57 AM Albab Hasan <albabhasan276@gmail.com> wrote:
>
> These methods were stabilized in Rust 1.80.0, which is the current
> minimum supported Rust version for the kernel.
No, it is not 1.80.0, but 1.78.0 -- please check
`Documentation/process/changes.rst`.
We can still use them, since they were added in 1.77 from a quick
look, though, but the feature would need to be enabled.
We will soon bump the minimum this cycle (but it will not be 1.80 but
1.85), so we could alternatively just put the patch on top instead of
enabling the feature.
Thanks!
Cheers,
Miguel
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked()
2026-03-10 9:57 [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked() Albab Hasan
2026-03-10 10:03 ` Miguel Ojeda
@ 2026-03-10 12:57 ` Alexandre Courbot
1 sibling, 0 replies; 4+ messages in thread
From: Alexandre Courbot @ 2026-03-10 12:57 UTC (permalink / raw)
To: Albab Hasan; +Cc: rust-for-linux, ojeda, linux-kernel
On Tue Mar 10, 2026 at 6:57 PM JST, Albab Hasan wrote:
> Replace manual bounds checking followed by split_at() and split_at_mut()
> calls with the checked variants split_at_checked() and
> split_at_mut_checked(), which return None instead of panicking on
> out-of-bounds indices.
>
> These methods were stabilized in Rust 1.80.0, which is the current
> minimum supported Rust version for the kernel.
>
> This simplifies from_bytes_prefix(), from_bytes_mut_prefix(), and
> from_bytes_copy_prefix() by removing the explicit bounds checks and
> panic-avoidance comments that are no longer needed.
>
> Signed-off-by: Albab Hasan <albabhasan276@gmail.com>
> ---
> rust/kernel/transmute.rs | 33 ++++++---------------------------
> 1 file changed, 6 insertions(+), 27 deletions(-)
>
> diff --git a/rust/kernel/transmute.rs b/rust/kernel/transmute.rs
> index 5711580c9f9b..643b19406a24 100644
> --- a/rust/kernel/transmute.rs
> +++ b/rust/kernel/transmute.rs
> @@ -67,16 +67,9 @@ fn from_bytes_prefix(bytes: &[u8]) -> Option<(&Self, &[u8])>
> where
> Self: Sized,
> {
> - if bytes.len() < size_of::<Self>() {
> - None
> - } else {
> - // PANIC: We checked that `bytes.len() >= size_of::<Self>`, thus `split_at` cannot
> - // panic.
> - // TODO: replace with `split_at_checked` once the MSRV is >= 1.80.
> - let (prefix, remainder) = bytes.split_at(size_of::<Self>());
> + let (prefix, remainder) = bytes.split_at_checked(size_of::<Self>())?;
>
> - Self::from_bytes(prefix).map(|s| (s, remainder))
> - }
> + Self::from_bytes(prefix).map(|s| (s, remainder))
Or as a single expression:
bytes
.split_at_checked(size_of::<Self>())
.and_then(|(prefix, remainder)| Some((Self::from_bytes(prefix)?, remainder)))
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-03-11 6:44 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-10 9:57 [PATCH] rust: transmute: use split_at_checked() and split_at_mut_checked() Albab Hasan
2026-03-10 10:03 ` Miguel Ojeda
[not found] ` <CAM9eepV-3Oh8yY4JaLtiU9bbxJfA+Kf9m-yZdOuVfp-pHQ3+=Q@mail.gmail.com>
[not found] ` <CANiq72kqq_WKFPLkcykv8WbhVWmDt=g0dYnjZUYEehxMrmkOQw@mail.gmail.com>
2026-03-11 6:44 ` Albab Hasan
2026-03-10 12:57 ` Alexandre Courbot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox