FAILED: patch "[PATCH] rust: macros: provide correct provenance when constructing" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x a5a3c952e82c1ada12bf8c55b73af26f1a454bd2
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024090831-camera-backlands-a643@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
a5a3c952e82c ("rust: macros: provide correct provenance when constructing THIS_MODULE")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a5a3c952e82c1ada12bf8c55b73af26f1a454bd2 Mon Sep 17 00:00:00 2001
From: Boqun Feng <[email protected]>
Date: Wed, 28 Aug 2024 11:01:29 -0700
Subject: [PATCH] rust: macros: provide correct provenance when constructing
THIS_MODULE
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.
rust/macros/module.rs +5 -1
@@ -217,7 +217,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_moduleas *const _ as *mut _ ) + extern \"C\" {{ +static __this_module: kernel::types::Opaque <kernel::bindings::module >; + }} + + kernel::ThisModule ::from_ptr (__this_module.get ()) }};#[cfg(not( MODULE ))] static THIS_MODULE : kernel::ThisModule =unsafe {{
[Cc Sasha]
Quoted 65 lines · On Sun, Sep 08, 2024 at 01:26:32PM +0200, [email protected] wrote:
The patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkoutFETCH_HEAD
git cherry-pick -xa5a3c952e82c1ada12bf8c55b73af26f1a454bd2
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024090831-camera-backlands-a643@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..Possible dependencies:
a5a3c952e82c("rust: macros: provide correct provenance when constructingTHIS_MODULE")thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
a5a3c952e82c1ada12bf8c55b73af26f1a454bd2Mon Sep 17 00:00:00 2001
From: Boqun Feng <[email protected]>
Date: Wed, 28 Aug 2024 11:01:29 -0700
Subject: [PATCH] rust: macros: provide correct provenance when constructing
THIS_MODULECurrently while defining
THIS_MODULEsymbol inmodule!(), the pointer used to constructThisModuleis 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 ofTHIS_MODULEincludes 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 ofaddr_of_mut()!, an extern staticOpaqueis used here: sinceOpaque<T>is transparent toT, an extern staticOpaquewill just wrap the C symbol (defined in a C compile unit) in anOpaque, which provides a pointer with writable provenance viaOpaque::get(). This fix the potential UBs because of pointer provenance unmatched.Reported-by Alice Ryhl <[email protected]>Signed-off-by Boqun Feng <[email protected]>Reviewed-by Alice Ryhl <[email protected]>Reviewed-by Trevor Gross <[email protected]>Reviewed-by Benno Lossin <[email protected]>Reviewed-by Gary Guo <[email protected]>Fixes 1fbde52bde73 ("rust: add `macros` crate")Cc [email protected] # 6.6.x: be2ca1e03965: ("rust: types: Make Opaque::get const")[ Fixed two typos, reworded title. - Miguel ]Signed-off-by Miguel Ojeda <[email protected]>rust/macros/module.rs +0
-0
rust/macros/module.rs pub(crate) fn module(ts: TokenStream) -> TokenStream { · line 221
Quoted 6 lines
rust/macros/module.rs +2
-1@@ -217,7 +217,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_moduleas *const _ as *mut _ ) + extern \"C\" {{ + static __this_module: kernel::types::Opaque<kernel::bindings::module>;
As Gary mentioned:
https://lore.kernel.org/stable/[email protected]/
Opaque doesn't exist in 6.1. We could use UnsafeCell here to replace Opaque. I will send a backport patch later today if needed.
Regards,
Boqun
Quoted 7 lines
rust/macros/module.rs +3
-0+ }} + + kernel::ThisModule ::from_ptr (__this_module.get ()) }};#[cfg(not( MODULE ))] static THIS_MODULE : kernel::ThisModule =unsafe {{
Quoted 9 lines · Boqun Feng
Quoted 3 lines
Fixes 1fbde52bde73 ("rust: add `macros` crate")Cc [email protected] # 6.6.x: be2ca1e03965: ("rust: types: Make Opaque::get const")As Gary mentioned:
https://lore.kernel.org/stable/[email protected]/
Opaquedoesn't exist in 6.1. We could useUnsafeCellhere to replaceOpaque. I will send a backport patch later today if needed.
+1 -- Greg/Sasha: for context, this is the one I asked about using Option 3 since otherwise the list of cherry-picks for 6.1 would be quite long.
Boqun: yeah, if you want to send the targeted backport, then that would be great. Otherwise I will do it in a few days. Thanks!
Cheers,
Miguel