mirror-linux/rust/kernel
Danilo Krummrich 97ab3e8eec rust: alloc: fix dangling pointer in VecExt<T>::reserve()
Currently, a Vec<T>'s ptr value, after calling Vec<T>::new(), is
initialized to Unique::dangling(). Hence, in VecExt<T>::reserve(), we're
passing a dangling pointer (instead of NULL) to krealloc() whenever a new
Vec<T>'s backing storage is allocated through VecExt<T> extension
functions.

This only works as long as align_of::<T>(), used by Unique::dangling() to
derive the dangling pointer, resolves to a value between 0x0 and
ZERO_SIZE_PTR (0x10) and krealloc() hence treats it the same as a NULL
pointer however.

This isn't a case we should rely on, since there may be types whose
alignment may exceed the range still covered by krealloc(), plus other
kernel allocators are not as tolerant either.

Instead, pass a real NULL pointer to krealloc_aligned() if Vec<T>'s
capacity is zero.

Fixes: 5ab560ce12 ("rust: alloc: update `VecExt` to take allocation flags")
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
Signed-off-by: Danilo Krummrich <dakr@redhat.com>
Reviewed-by: Wedson Almeida Filho <walmeida@microsoft.com>
Link: https://lore.kernel.org/r/20240501134834.22323-1-dakr@redhat.com
[ Solved `use` conflict and applied the `if`-instead-of-`match` change
  discussed in the list. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
2024-05-08 00:43:30 +02:00
..
alloc rust: alloc: fix dangling pointer in VecExt<T>::reserve() 2024-05-08 00:43:30 +02:00
init rust: init: change the generated name of guard variables 2024-05-05 18:05:00 +02:00
net rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
sync rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
alloc.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
build_assert.rs rust: upgrade to Rust 1.68.2 2023-05-31 17:35:03 +02:00
error.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
init.rs rust: remove unneeded `kernel::prelude` imports from doctests 2024-05-05 18:09:04 +02:00
ioctl.rs rust: kernel: mark code fragments in docs with backticks 2024-02-18 21:22:27 +01:00
kunit.rs rust: support `srctree`-relative links 2023-12-21 20:54:17 +01:00
lib.rs rust: kernel: remove usage of `allocator_api` unstable feature 2024-04-16 22:50:04 +02:00
net.rs rust: core abstractions for network PHY drivers 2023-12-15 09:35:50 +00:00
prelude.rs rust: alloc: introduce the `BoxExt` trait 2024-04-16 22:47:20 +02:00
print.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
static_assert.rs rust: static_assert: add `static_assert!` macro 2022-12-04 01:59:16 +01:00
std_vendor.rs rust: update `dbg!()` to format column number 2024-05-05 18:09:04 +02:00
str.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
sync.rs rust: sync: implement `Default` for `LockClassKey` 2024-05-05 19:22:25 +02:00
task.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
time.rs rust: time: add msecs to jiffies conversion 2024-01-28 19:50:48 +01:00
types.rs rust: types: Make Opaque::get const 2024-05-05 13:19:37 +02:00
workqueue.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00