Re: [PATCH] rust: devres: add 'static bound to Devres<T>

From: Gary Guo

Date: Wed May 27 2026 - 10:53:20 EST


On Tue May 26, 2026 at 1:04 AM BST, Danilo Krummrich wrote:
> Devres::new() registers a callback with the C devres subsystem via
> devres_node_add(). If the Devres is leaked (e.g. via
> core::mem::forget(), which is safe), its Drop impl never runs, and the
> devres release callback will revoke the inner Revocable on device
> unbind, which drops T in place. If T contains non-'static references,
> those may be dangling by that point.
>
> Add a 'static bound to prevent storing types with borrowed data in
> Devres.

The bound should be added on `Devres::new` instead.

Best,
Gary

>
> Fixes: 76c01ded724b ("rust: add devres abstraction")
> Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx>
> ---
> rust/kernel/devres.rs | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs
> index 9e5f93aed20c..2e258d31a45c 100644
> --- a/rust/kernel/devres.rs
> +++ b/rust/kernel/devres.rs
> @@ -122,7 +122,7 @@ struct Inner<T> {
> /// # Ok(())
> /// # }
> /// ```
> -pub struct Devres<T: Send> {
> +pub struct Devres<T: Send + 'static> {
> dev: ARef<Device>,
> inner: Arc<Inner<T>>,
> }
> @@ -184,7 +184,7 @@ pub(super) unsafe fn devres_node_remove(
> }
> }
>
> -impl<T: Send> Devres<T> {
> +impl<T: Send + 'static> Devres<T> {
> /// Creates a new [`Devres`] instance of the given `data`.
> ///
> /// The `data` encapsulated within the returned `Devres` instance' `data` will be
> @@ -349,7 +349,7 @@ unsafe impl<T: Send> Send for Devres<T> {}
> // SAFETY: `Devres` can be shared with any task, if `T: Sync`.
> unsafe impl<T: Send + Sync> Sync for Devres<T> {}
>
> -impl<T: Send> Drop for Devres<T> {
> +impl<T: Send + 'static> Drop for Devres<T> {
> fn drop(&mut self) {
> // SAFETY: When `drop` runs, it is guaranteed that nobody is accessing the revocable data
> // anymore, hence it is safe not to wait for the grace period to finish.
>
> base-commit: 56785dcb2ef6d3cff82ac33f2e34db94377416a3