diff options
| author | Benno Lossin <lossin@kernel.org> | 2026-01-16 11:54:23 +0100 |
|---|---|---|
| committer | Benno Lossin <lossin@kernel.org> | 2026-01-17 10:51:42 +0100 |
| commit | dae5466c4aa5b43a6cda4282bf9ff8e6b42ece0e (patch) | |
| tree | c97cfb2eebdcf077b8ccb01d07ae7ad93de251fe /rust/pin-init/internal | |
| parent | 560f6d13c33f9f06ca34c14dc7c0a045d949c4a0 (diff) | |
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>
Diffstat (limited to 'rust/pin-init/internal')
| -rw-r--r-- | rust/pin-init/internal/src/pin_data.rs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs index 11ea3f8d8a1b..7d871236b49c 100644 --- a/rust/pin-init/internal/src/pin_data.rs +++ b/rust/pin-init/internal/src/pin_data.rs @@ -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 |
