Skip to contentSkip to conversation

FAILED: patch "[PATCH] rust: macros: provide correct provenance when constructing" failed to apply to 6.1-stable tree

PATCH [email protected] 3 participants 3 messages Sep 8, 2024 – Sep 10, 2024

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

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 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.

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 ]
rust/macros/module.rs +5 -1
index 411dc103d82e..7a5b899e47b7 100644
@@ -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_module as *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 {{
#1 lore raw

[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 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.

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 ]
rust/macros/module.rs +0 -0
index 411dc103d82e..7a5b899e47b7 100644

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_module as *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 {{
#2 lore raw
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]/

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.

+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