mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-05 00:07:48 -04:00
rust: pin-init: add ?Sized bounds to traits in #[pin_data] macro
The `#[pin_data]` macro uses some auxiliary traits to ensure that a user does not implement `Drop` for the annotated struct, as that is unsound and can lead to UB. However, if the struct that is annotated is `!Sized`, the current bounds do not work, because `Sized` is an implicit bound for generics. This is *not* a soundness hole of pin-init, as it currently is impossible to construct an unsized struct using pin-init. Tested-by: Andreas Hindborg <a.hindborg@kernel.org> Reviewed-by: Gary Guo <gary@garyguo.net> Signed-off-by: Benno Lossin <lossin@kernel.org>
This commit is contained in:
@@ -215,7 +215,7 @@ fn generate_drop_impl(ident: &Ident, generics: &Generics, args: Args) -> TokenSt
|
||||
// if it also implements `Drop`
|
||||
trait MustNotImplDrop {}
|
||||
#[expect(drop_bounds)]
|
||||
impl<T: ::core::ops::Drop> MustNotImplDrop for T {}
|
||||
impl<T: ::core::ops::Drop + ?::core::marker::Sized> MustNotImplDrop for T {}
|
||||
impl #impl_generics MustNotImplDrop for #ident #ty_generics
|
||||
#whr
|
||||
{}
|
||||
@@ -224,7 +224,7 @@ fn generate_drop_impl(ident: &Ident, generics: &Generics, args: Args) -> TokenSt
|
||||
// `PinnedDrop` as the parameter to `#[pin_data]`.
|
||||
#[expect(non_camel_case_types)]
|
||||
trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
|
||||
impl<T: ::pin_init::PinnedDrop>
|
||||
impl<T: ::pin_init::PinnedDrop + ?::core::marker::Sized>
|
||||
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
|
||||
impl #impl_generics
|
||||
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for #ident #ty_generics
|
||||
|
||||
Reference in New Issue
Block a user