rust: init: remove impl Zeroable for Infallible

In Rust, producing an invalid value of any type is immediate undefined
behavior (UB); this includes via zeroing memory. Therefore, since an
uninhabited type has no valid values, producing any values at all for it is
UB.

The Rust standard library type `core::convert::Infallible` is uninhabited,
by virtue of having been declared as an enum with no cases, which always
produces uninhabited types in Rust.

The current kernel code allows this UB to be triggered, for example by code
like `Box::<core::convert::Infallible>::init(kernel::init::zeroed())`.

Thus, remove the implementation of `Zeroable` for `Infallible`, thereby
avoiding the unsoundness (potential for future UB).

Cc: stable@vger.kernel.org
Fixes: 38cde0bd7b67 ("rust: init: add `Zeroable` trait and `init::zeroed` function")
Closes: https://github.com/Rust-for-Linux/pinned-init/pull/13
Signed-off-by: Laine Taffin Altman <alexanderaltman@me.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
Link: https://lore.kernel.org/r/CA160A4E-561E-4918-837E-3DCEBA74F808@me.com
[ Reformatted the comment slightly. ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>

authored by Laine Taffin Altman and committed by Miguel Ojeda 49ceae68 01848eee

+9 -2
+9 -2
rust/kernel/init.rs
··· 1292 1292 i8, i16, i32, i64, i128, isize, 1293 1293 f32, f64, 1294 1294 1295 - // SAFETY: These are ZSTs, there is nothing to zero. 1296 - {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, Infallible, (), 1295 + // Note: do not add uninhabited types (such as `!` or `core::convert::Infallible`) to this list; 1296 + // creating an instance of an uninhabited type is immediate undefined behavior. For more on 1297 + // uninhabited/empty types, consult The Rustonomicon: 1298 + // <https://doc.rust-lang.org/stable/nomicon/exotic-sizes.html#empty-types>. The Rust Reference 1299 + // also has information on undefined behavior: 1300 + // <https://doc.rust-lang.org/stable/reference/behavior-considered-undefined.html>. 1301 + // 1302 + // SAFETY: These are inhabited ZSTs; there is nothing to zero and a valid value exists. 1303 + {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, (), 1297 1304 1298 1305 // SAFETY: Type is allowed to take any value, including all zeros. 1299 1306 {<T>} MaybeUninit<T>,