diff options
author | Danilo Krummrich <dakr@kernel.org> | 2025-07-14 13:32:35 +0200 |
---|---|---|
committer | Danilo Krummrich <dakr@kernel.org> | 2025-07-15 14:46:09 +0200 |
commit | 91ae26b06aab476bdd8b56cd99e127f029490330 (patch) | |
tree | ebaec0e300811016e6a5b9eb4c9ec11c5e15120e /rust/kernel | |
parent | 3964d07dd821efe9680e90c51c86661a98e60a0f (diff) |
rust: devres: initialize Devres::inner::data last
Users may want to access the Devres object from callbacks registered
through the initialization of Devres::inner::data.
For those accesses to be valid, Devres::inner::data must be initialized
last [1].
Credit to Boqun for spotting this [2].
Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250714113712.22158-1-dakr@kernel.org
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'rust/kernel')
-rw-r--r-- | rust/kernel/devres.rs | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs index f43de3d77d61..ac5e5d94ee96 100644 --- a/rust/kernel/devres.rs +++ b/rust/kernel/devres.rs @@ -137,14 +137,10 @@ impl<T: Send> Devres<T> { let callback = Self::devres_callback; try_pin_init!(&this in Self { - // INVARIANT: `inner` is properly initialized. - inner <- Opaque::pin_init(try_pin_init!(Inner { - data <- Revocable::new(data), - devm <- Completion::new(), - revoke <- Completion::new(), - })), + dev: dev.into(), callback, - dev: { + // INVARIANT: `inner` is properly initialized. + inner <- { // SAFETY: `this` is a valid pointer to uninitialized memory. let inner = unsafe { &raw mut (*this.as_ptr()).inner }; @@ -158,7 +154,11 @@ impl<T: Send> Devres<T> { bindings::devm_add_action(dev.as_raw(), Some(callback), inner.cast()) })?; - dev.into() + Opaque::pin_init(try_pin_init!(Inner { + devm <- Completion::new(), + revoke <- Completion::new(), + data <- Revocable::new(data), + })) }, }) } |