diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index e8002abe69..843ae283ce 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -1,6 +1,7 @@ //! stdlib implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/stdlib.h.html use core::{intrinsics, iter, mem, ptr, slice}; +use core::convert::TryFrom; use rand::distributions::{Alphanumeric, Distribution, Uniform}; use rand::prng::XorShiftRng; use rand::rngs::JitterRng; @@ -14,6 +15,7 @@ use header::limits; use header::string::*; use header::time::constants::CLOCK_MONOTONIC; use header::time::timespec; +use header::unistd::{sysconf, _SC_PAGESIZE}; use header::wchar::*; use header::{ctype, errno, unistd}; use platform; @@ -1008,7 +1010,15 @@ pub unsafe extern "C" fn unsetenv(key: *const c_char) -> c_int { #[no_mangle] pub unsafe extern "C" fn valloc(size: size_t) -> *mut c_void { - memalign(4096, size) + /* _SC_PAGESIZE is a c_long and may in principle not convert + * correctly to a size_t. */ + match size_t::try_from(sysconf(_SC_PAGESIZE)) { + Ok(page_size) => memalign(page_size, size), + Err(_) => { + // A corner case. No errno setting. + ptr::null_mut() + } + } } #[no_mangle]