From d7df262de1b54ee76269ffa2d127433f9002c2ad Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" Date: Wed, 20 May 2026 17:10:14 +0900 Subject: [PATCH 1/2] Re-export mmap libc constants through host_env Move direct libc MADV_*, MAP_*, PROT_*, EOVERFLOW references in stdlib::mmap to host_env::mmap re-exports. Replace libc::c_int with core::ffi::c_int. --- crates/host_env/src/mmap.rs | 57 +++++++++++++++++++++++++++++++++++++ crates/stdlib/src/mmap.rs | 38 ++++++++++++++----------- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/crates/host_env/src/mmap.rs b/crates/host_env/src/mmap.rs index 62dc50f1c31..10a1c45f404 100644 --- a/crates/host_env/src/mmap.rs +++ b/crates/host_env/src/mmap.rs @@ -5,6 +5,63 @@ use std::io; +#[cfg(unix)] +pub use libc::{ + MADV_DONTNEED, MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL, MADV_WILLNEED, MAP_ANON, + MAP_ANONYMOUS, MAP_PRIVATE, MAP_SHARED, PROT_EXEC, PROT_READ, PROT_WRITE, +}; + +#[cfg(target_os = "macos")] +pub use libc::{MADV_FREE_REUSABLE, MADV_FREE_REUSE}; + +#[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "freebsd", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + target_vendor = "apple" +))] +pub use libc::MADV_FREE; + +#[cfg(target_os = "linux")] +pub use libc::{ + MADV_DODUMP, MADV_DOFORK, MADV_DONTDUMP, MADV_DONTFORK, MADV_HUGEPAGE, MADV_HWPOISON, + MADV_MERGEABLE, MADV_NOHUGEPAGE, MADV_REMOVE, MADV_UNMERGEABLE, +}; + +#[cfg(any( + target_os = "android", + all( + target_os = "linux", + any( + target_arch = "aarch64", + target_arch = "arm", + target_arch = "powerpc", + target_arch = "powerpc64", + target_arch = "s390x", + target_arch = "x86", + target_arch = "x86_64", + target_arch = "sparc64" + ) + ) +))] +pub use libc::MADV_SOFT_OFFLINE; + +#[cfg(all(target_os = "linux", target_arch = "x86_64", target_env = "gnu"))] +pub use libc::{MAP_DENYWRITE, MAP_EXECUTABLE, MAP_POPULATE}; + +#[cfg(any(target_os = "linux", target_os = "openbsd", target_os = "netbsd"))] +pub use libc::MAP_STACK; + +#[cfg(target_os = "freebsd")] +pub use libc::{MADV_AUTOSYNC, MADV_CORE, MADV_NOCORE, MADV_NOSYNC, MADV_PROTECT}; + +#[cfg(unix)] +pub use libc::EOVERFLOW; + #[cfg(windows)] use crate::windows::{CheckWin32Bool, HandleToOwned}; #[cfg(unix)] diff --git a/crates/stdlib/src/mmap.rs b/crates/stdlib/src/mmap.rs index 2332ee0e1ce..dac24b053c2 100644 --- a/crates/stdlib/src/mmap.rs +++ b/crates/stdlib/src/mmap.rs @@ -60,14 +60,14 @@ mod mmap { #[cfg(unix)] #[pyattr] - use libc::{ + use host_mmap::{ MADV_DONTNEED, MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL, MADV_WILLNEED, MAP_ANON, MAP_ANONYMOUS, MAP_PRIVATE, MAP_SHARED, PROT_EXEC, PROT_READ, PROT_WRITE, }; #[cfg(target_os = "macos")] #[pyattr] - use libc::{MADV_FREE_REUSABLE, MADV_FREE_REUSE}; + use host_mmap::{MADV_FREE_REUSABLE, MADV_FREE_REUSE}; #[cfg(any( target_os = "android", @@ -80,11 +80,11 @@ mod mmap { target_vendor = "apple" ))] #[pyattr] - use libc::MADV_FREE; + use host_mmap::MADV_FREE; #[cfg(target_os = "linux")] #[pyattr] - use libc::{ + use host_mmap::{ MADV_DODUMP, MADV_DOFORK, MADV_DONTDUMP, MADV_DONTFORK, MADV_HUGEPAGE, MADV_HWPOISON, MADV_MERGEABLE, MADV_NOHUGEPAGE, MADV_REMOVE, MADV_UNMERGEABLE, }; @@ -106,21 +106,21 @@ mod mmap { ) ))] #[pyattr] - use libc::MADV_SOFT_OFFLINE; + use host_mmap::MADV_SOFT_OFFLINE; #[cfg(all(target_os = "linux", target_arch = "x86_64", target_env = "gnu"))] #[pyattr] - use libc::{MAP_DENYWRITE, MAP_EXECUTABLE, MAP_POPULATE}; + use host_mmap::{MAP_DENYWRITE, MAP_EXECUTABLE, MAP_POPULATE}; // MAP_STACK is available on Linux, OpenBSD, and NetBSD #[cfg(any(target_os = "linux", target_os = "openbsd", target_os = "netbsd"))] #[pyattr] - use libc::MAP_STACK; + use host_mmap::MAP_STACK; // FreeBSD-specific MADV constants #[cfg(target_os = "freebsd")] #[pyattr] - use libc::{MADV_AUTOSYNC, MADV_CORE, MADV_NOCORE, MADV_NOSYNC, MADV_PROTECT}; + use host_mmap::{MADV_AUTOSYNC, MADV_CORE, MADV_NOCORE, MADV_NOSYNC, MADV_PROTECT}; #[pyattr] const ACCESS_DEFAULT: u32 = AccessMode::Default as u32; @@ -212,10 +212,10 @@ mod mmap { fileno: i32, #[pyarg(any)] length: isize, - #[pyarg(any, default = libc::MAP_SHARED)] - flags: libc::c_int, - #[pyarg(any, default = libc::PROT_WRITE | libc::PROT_READ)] - prot: libc::c_int, + #[pyarg(any, default = host_mmap::MAP_SHARED)] + flags: core::ffi::c_int, + #[pyarg(any, default = host_mmap::PROT_WRITE | host_mmap::PROT_READ)] + prot: core::ffi::c_int, #[pyarg(any, default = AccessMode::Default)] access: AccessMode, #[pyarg(any, default = 0)] @@ -294,7 +294,7 @@ mod mmap { #[derive(FromArgs)] pub(super) struct AdviseOptions { #[pyarg(positional)] - option: libc::c_int, + option: core::ffi::c_int, #[pyarg(positional, default)] start: Option, #[pyarg(positional, default)] @@ -303,7 +303,11 @@ mod mmap { #[cfg(all(unix, not(target_os = "redox")))] impl AdviseOptions { - fn values(self, len: usize, vm: &VirtualMachine) -> PyResult<(libc::c_int, usize, usize)> { + fn values( + self, + len: usize, + vm: &VirtualMachine, + ) -> PyResult<(core::ffi::c_int, usize, usize)> { let start = self .start .map(|s| { @@ -342,7 +346,7 @@ mod mmap { #[cfg(unix)] fn py_new(_cls: &Py, args: Self::Args, vm: &VirtualMachine) -> PyResult { - use libc::{MAP_PRIVATE, MAP_SHARED, PROT_READ, PROT_WRITE}; + use host_mmap::{MAP_PRIVATE, MAP_SHARED, PROT_READ, PROT_WRITE}; let mut map_size = args.validate_new_args(vm)?; let MmapNewArgs { @@ -552,7 +556,7 @@ mod mmap { map_size, ) .map_err(|err| { - if err.raw_os_error() == Some(libc::EOVERFLOW) { + if err.raw_os_error() == Some(host_mmap::EOVERFLOW) { vm.new_overflow_error("mmap offset plus size would overflow") } else { err.to_pyexception(vm) @@ -1074,7 +1078,7 @@ mod mmap { fn seek( &self, dist: isize, - whence: OptionalArg, + whence: OptionalArg, vm: &VirtualMachine, ) -> PyResult<()> { let how = whence.unwrap_or(0); From f97c1b4797fc9cd9ed975ccca353b812b45a440b Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Mon, 6 Jul 2026 18:00:17 +0900 Subject: [PATCH 2/2] host_env/mmap: gate EOVERFLOW re-export on cfg(windows) Its only consumer is the cfg(windows) named-mapping overflow check in stdlib::mmap; the re-export was gated cfg(unix), so it was configured out on Windows and the reference failed to resolve. Assisted-by: Claude --- crates/host_env/src/mmap.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/host_env/src/mmap.rs b/crates/host_env/src/mmap.rs index 10a1c45f404..ce5575061e3 100644 --- a/crates/host_env/src/mmap.rs +++ b/crates/host_env/src/mmap.rs @@ -59,7 +59,7 @@ pub use libc::MAP_STACK; #[cfg(target_os = "freebsd")] pub use libc::{MADV_AUTOSYNC, MADV_CORE, MADV_NOCORE, MADV_NOSYNC, MADV_PROTECT}; -#[cfg(unix)] +#[cfg(windows)] pub use libc::EOVERFLOW; #[cfg(windows)]