Patch "rust: macros: provide correct provenance when constructing THIS_MODULE" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    rust: macros: provide correct provenance when constructing THIS_MODULE

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rust-macros-provide-correct-provenance-when-construc.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 77b1a248eb3559a3f0793cac89b7595b6de4ec7a
Author: Boqun Feng <boqun.feng@xxxxxxxxx>
Date:   Fri Oct 11 16:12:28 2024 -0700

    rust: macros: provide correct provenance when constructing THIS_MODULE
    
    commit a5a3c952e82c1ada12bf8c55b73af26f1a454bd2 upstream.
    
    Currently while defining `THIS_MODULE` symbol in `module!()`, the
    pointer used to construct `ThisModule` is derived from an immutable
    reference of `__this_module`, which means the pointer doesn't have
    the provenance for writing, and that means any write to that pointer
    is UB regardless of data races or not. However, the usage of
    `THIS_MODULE` includes passing this pointer to functions that may write
    to it (probably in unsafe code), and this will create soundness issues.
    
    One way to fix this is using `addr_of_mut!()` but that requires the
    unstable feature "const_mut_refs". So instead of `addr_of_mut()!`,
    an extern static `Opaque` is used here: since `Opaque<T>` is transparent
    to `T`, an extern static `Opaque` will just wrap the C symbol (defined
    in a C compile unit) in an `Opaque`, which provides a pointer with
    writable provenance via `Opaque::get()`. This fix the potential UBs
    because of pointer provenance unmatched.
    
    Reported-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
    Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx>
    Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
    Reviewed-by: Trevor Gross <tmgross@xxxxxxxxx>
    Reviewed-by: Benno Lossin <benno.lossin@xxxxxxxxx>
    Reviewed-by: Gary Guo <gary@xxxxxxxxxxx>
    Closes: https://rust-for-linux.zulipchat.com/#narrow/stream/x/topic/x/near/465412664
    Fixes: 1fbde52bde73 ("rust: add `macros` crate")
    Cc: stable@xxxxxxxxxxxxxxx # 6.6.x: be2ca1e03965: ("rust: types: Make Opaque::get const")
    Link: https://lore.kernel.org/r/20240828180129.4046355-1-boqun.feng@xxxxxxxxx
    [ Fixed two typos, reworded title. - Miguel ]
    Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>
    [ Boqun: Use `UnsafeCell` since `Opaque` is not in v6.1, as suggested by
      Gary Guo, `UnsafeCell` also suffices for this particular case because
      `__this_module` is only used to create `THIS_MODULE`, no other Rust
      code will touch it. ]
    Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/rust/macros/module.rs b/rust/macros/module.rs
index 031028b3dc41b..94a92ab82b6b3 100644
--- a/rust/macros/module.rs
+++ b/rust/macros/module.rs
@@ -183,7 +183,11 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream {
             // freed until the module is unloaded.
             #[cfg(MODULE)]
             static THIS_MODULE: kernel::ThisModule = unsafe {{
-                kernel::ThisModule::from_ptr(&kernel::bindings::__this_module as *const _ as *mut _)
+                extern \"C\" {{
+                    static __this_module: core::cell::UnsafeCell<kernel::bindings::module>;
+                }}
+
+                kernel::ThisModule::from_ptr(__this_module.get())
             }};
             #[cfg(not(MODULE))]
             static THIS_MODULE: kernel::ThisModule = unsafe {{




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux