diff options
| author | Josh Stone <jistone@redhat.com> | 2023-08-26 11:50:16 -0700 | 
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2023-08-26 11:50:16 -0700 | 
| commit | 1c6d867d78475fd8c6274e2b64ebb27735b6cabf (patch) | |
| tree | 5ab19a8542cf658ae3db95299b20fe9f6eefdfb9 /library/std/src/sys/unix/alloc.rs | |
| parent | 22d41ae90facbffdef9115809e8b6c1f71ebbf7c (diff) | |
| download | rust-1c6d867d78475fd8c6274e2b64ebb27735b6cabf.tar.gz rust-1c6d867d78475fd8c6274e2b64ebb27735b6cabf.zip | |
wasi: round up the size for `aligned_alloc`
C11 `aligned_alloc` requires that the size be a multiple of the alignment. This is enforced in the wasi-libc emmalloc implementation, which always returns NULL if the size is not a multiple. (The default `MALLOC_IMPL=dlmalloc` does not currently check this.)
Diffstat (limited to 'library/std/src/sys/unix/alloc.rs')
| -rw-r--r-- | library/std/src/sys/unix/alloc.rs | 6 | 
1 files changed, 5 insertions, 1 deletions
| diff --git a/library/std/src/sys/unix/alloc.rs b/library/std/src/sys/unix/alloc.rs index 8604b53983d..af0089978ec 100644 --- a/library/std/src/sys/unix/alloc.rs +++ b/library/std/src/sys/unix/alloc.rs @@ -86,7 +86,11 @@ cfg_if::cfg_if! { } else if #[cfg(target_os = "wasi")] { #[inline] unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 { - libc::aligned_alloc(layout.align(), layout.size()) as *mut u8 + // C11 aligned_alloc requires that the size be a multiple of the alignment. + // Layout already checks that the size rounded up doesn't overflow isize::MAX. + let align = layout.align(); + let size = layout.size().next_multiple_of(align); + libc::aligned_alloc(align, size) as *mut u8 } } else { #[inline] | 
