mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	rust: init: fix Zeroable implementation for Option<NonNull<T>> and Option<KBox<T>>
				
					
				
			According to [1], `NonNull<T>` and `#[repr(transparent)]` wrapper types
such as our custom `KBox<T>` have the null pointer optimization only if
`T: Sized`. Thus remove the `Zeroable` implementation for the unsized
case.
Link: https://doc.rust-lang.org/stable/std/option/index.html#representation [1]
Reported-by: Alice Ryhl <aliceryhl@google.com>
Closes: https://lore.kernel.org/rust-for-linux/CAH5fLghL+qzrD8KiCF1V3vf2YcC6aWySzkmaE2Zzrnh1gKj-hw@mail.gmail.com/
Cc: stable@vger.kernel.org # v6.12+ (a custom patch will be needed for 6.6.y)
Fixes: 38cde0bd7b ("rust: init: add `Zeroable` trait and `init::zeroed` function")
Signed-off-by: Benno Lossin <benno.lossin@proton.me>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org>
Link: https://lore.kernel.org/r/20250305132836.2145476-1-benno.lossin@proton.me
[ Added Closes tag and moved up the Reported-by one. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									374908a15a
								
							
						
					
					
						commit
						df27cef153
					
				
					 1 changed files with 4 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -1418,17 +1418,14 @@ macro_rules! impl_zeroable {
 | 
			
		|||
    // SAFETY: `T: Zeroable` and `UnsafeCell` is `repr(transparent)`.
 | 
			
		||||
    {<T: ?Sized + Zeroable>} UnsafeCell<T>,
 | 
			
		||||
 | 
			
		||||
    // SAFETY: All zeros is equivalent to `None` (option layout optimization guarantee).
 | 
			
		||||
    // SAFETY: All zeros is equivalent to `None` (option layout optimization guarantee:
 | 
			
		||||
    // https://doc.rust-lang.org/stable/std/option/index.html#representation).
 | 
			
		||||
    Option<NonZeroU8>, Option<NonZeroU16>, Option<NonZeroU32>, Option<NonZeroU64>,
 | 
			
		||||
    Option<NonZeroU128>, Option<NonZeroUsize>,
 | 
			
		||||
    Option<NonZeroI8>, Option<NonZeroI16>, Option<NonZeroI32>, Option<NonZeroI64>,
 | 
			
		||||
    Option<NonZeroI128>, Option<NonZeroIsize>,
 | 
			
		||||
 | 
			
		||||
    // SAFETY: All zeros is equivalent to `None` (option layout optimization guarantee).
 | 
			
		||||
    //
 | 
			
		||||
    // In this case we are allowed to use `T: ?Sized`, since all zeros is the `None` variant.
 | 
			
		||||
    {<T: ?Sized>} Option<NonNull<T>>,
 | 
			
		||||
    {<T: ?Sized>} Option<KBox<T>>,
 | 
			
		||||
    {<T>} Option<NonNull<T>>,
 | 
			
		||||
    {<T>} Option<KBox<T>>,
 | 
			
		||||
 | 
			
		||||
    // SAFETY: `null` pointer is valid.
 | 
			
		||||
    //
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue