Skip to content

Commit ff64846

Browse files
tamirdojeda
authored andcommitted
rust: alloc: satisfy POSIX alignment requirement
ISO C's `aligned_alloc` is partially implementation-defined; on some systems it inherits stricter requirements from POSIX's `posix_memalign`. This causes the call added in commit dd09538 ("rust: alloc: implement `Cmalloc` in module allocator_test") to fail on macOS because it doesn't meet the requirements of `posix_memalign`. Adjust the call to meet the POSIX requirement and add a comment. This fixes failures in `make rusttest` on macOS. Acked-by: Danilo Krummrich <dakr@kernel.org> Cc: stable@vger.kernel.org Fixes: dd09538 ("rust: alloc: implement `Cmalloc` in module allocator_test") Signed-off-by: Tamir Duberstein <tamird@gmail.com> Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://lore.kernel.org/r/20250213-aligned-alloc-v7-1-d2a2d0be164b@gmail.com [ Added Cc: stable. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
1 parent df27cef commit ff64846

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

rust/kernel/alloc/allocator_test.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,24 @@ unsafe impl Allocator for Cmalloc {
6262
));
6363
}
6464

65+
// ISO C (ISO/IEC 9899:2011) defines `aligned_alloc`:
66+
//
67+
// > The value of alignment shall be a valid alignment supported by the implementation
68+
// [...].
69+
//
70+
// As an example of the "supported by the implementation" requirement, POSIX.1-2001 (IEEE
71+
// 1003.1-2001) defines `posix_memalign`:
72+
//
73+
// > The value of alignment shall be a power of two multiple of sizeof (void *).
74+
//
75+
// and POSIX-based implementations of `aligned_alloc` inherit this requirement. At the time
76+
// of writing, this is known to be the case on macOS (but not in glibc).
77+
//
78+
// Satisfy the stricter requirement to avoid spurious test failures on some platforms.
79+
let min_align = core::mem::size_of::<*const crate::ffi::c_void>();
80+
let layout = layout.align_to(min_align).map_err(|_| AllocError)?;
81+
let layout = layout.pad_to_align();
82+
6583
// SAFETY: Returns either NULL or a pointer to a memory allocation that satisfies or
6684
// exceeds the given size and alignment requirements.
6785
let dst = unsafe { libc_aligned_alloc(layout.align(), layout.size()) } as *mut u8;

0 commit comments

Comments
 (0)