diff --git a/Cargo.lock b/Cargo.lock index 9b6319172c1171ad904ab615ef8ec2b6440952d8..55ac709b980cff5af21a853958b6703c2e45c34b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -25,6 +25,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "cbindgen" version = "0.24.5" @@ -75,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_lex", "indexmap", "strsim", @@ -118,17 +124,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "goblin" @@ -162,12 +165,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - [[package]] name = "indexmap" version = "1.9.3" @@ -178,26 +175,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.3", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "itoa" version = "1.0.9" @@ -219,14 +196,15 @@ version = "0.1.0" [[package]] name = "libc" -version = "0.2.138" -source = "git+https://gitlab.redox-os.org/redox-os/liblibc.git?branch=redox_0.2.138#a92e39c0616f068b9fd9172d325004248c2dc1e8" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" @@ -381,7 +359,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -389,14 +367,14 @@ name = "redox_syscall" version = "0.4.1" source = "git+https://gitlab.redox-os.org/redox-os/syscall#06d569933f24af0c72b8bb2eb1aaa031113843fd" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "relibc" version = "0.2.5" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cbindgen", "cbitset", "cc", @@ -437,16 +415,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.3" +version = "0.38.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -511,18 +488,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -596,15 +573,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -686,37 +663,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] @@ -725,93 +678,51 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index f7ae07026d754bc7456c6d8b220f56681fd28108..b2a3040a34194257a3244c268e2fe6d36d57d3dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ rand = { version = "0.5.5", default-features = false } memchr = { version = "2.2.0", default-features = false } plain = "0.2" unicode-width = "0.1" -libc = { version = "=0.2.138", optional = true } +__libc_only_for_layout_checks = { package = "libc", version = "0.2.149", optional = true } [dependencies.goblin] version = "0.0.21" @@ -51,7 +51,7 @@ redox-exec = { path = "src/platform/redox/redox-exec" } [features] default = ["check_against_libc_crate"] trace = [] -check_against_libc_crate = ["libc"] +check_against_libc_crate = ["__libc_only_for_layout_checks"] [profile.dev] panic = "abort" @@ -60,5 +60,4 @@ panic = "abort" panic = "abort" [patch.crates-io] -libc = { git = "https://gitlab.redox-os.org/redox-os/liblibc.git", branch = "redox_0.2.138" } redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall" } diff --git a/build.rs b/build.rs index 2a81bd32133606fff52e021efbcc02e15528a296..6aaa801efd8b23d5394ae2c61627a43c5207c09f 100644 --- a/build.rs +++ b/build.rs @@ -3,7 +3,6 @@ extern crate cc; use std::{env, fs, fs::DirEntry, path::Path}; - // include src/header directories that don't start with '_' fn include_dir(d: &DirEntry) -> bool { d.metadata().map(|m| m.is_dir()).unwrap_or(false) @@ -15,10 +14,7 @@ fn include_dir(d: &DirEntry) -> bool { fn get_target() -> String { env::var("TARGET").unwrap_or( - option_env!("TARGET").map_or( - "x86_64-unknown-redox".to_string(), - |x| x.to_string() - ) + option_env!("TARGET").map_or("x86_64-unknown-redox".to_string(), |x| x.to_string()), ) } @@ -68,7 +64,8 @@ fn main() { let mut cc_builder = &mut cc::Build::new(); - cc_builder = cc_builder.flag("-nostdinc") + cc_builder = cc_builder + .flag("-nostdinc") .flag("-nostdlib") .include(&format!("{}/include", crate_dir)) .include(&format!("{}/target/include", crate_dir)); @@ -77,7 +74,8 @@ fn main() { cc_builder = cc_builder.flag("-mno-outline-atomics") } - cc_builder.flag("-fno-stack-protector") + cc_builder + .flag("-fno-stack-protector") .flag("-Wno-expansion-to-defined") .files( fs::read_dir("src/c") diff --git a/posix-regex b/posix-regex index 0d996efe5cfe7ce181af35d8817ac4deae644d4a..df45954609e219b11f108086b5861023a04126a7 160000 --- a/posix-regex +++ b/posix-regex @@ -1 +1 @@ -Subproject commit 0d996efe5cfe7ce181af35d8817ac4deae644d4a +Subproject commit df45954609e219b11f108086b5861023a04126a7 diff --git a/src/header/bits_pthread/mod.rs b/src/header/bits_pthread/mod.rs index b5b6de646ebf5bf3312627bf907f398f582288dd..72f43cbaffa3bf3b2454f05bfaac7e1fb9cb65e5 100644 --- a/src/header/bits_pthread/mod.rs +++ b/src/header/bits_pthread/mod.rs @@ -82,6 +82,8 @@ macro_rules! assert_equal_size( // TODO: Turn into a macro? #[cfg(all(target_os = "redox", feature = "check_against_libc_crate"))] const _: () = unsafe { + use ::__libc_only_for_layout_checks as libc; + let export = $export { __relibc_internal_align: 0 }; let _: libc::$export = core::mem::transmute(export.__relibc_internal_size); diff --git a/src/header/grp/mod.rs b/src/header/grp/mod.rs index ea1efd2dc94a578e97e1b127769e82735f21edad..e30a1d1557014db30b7c5f162be68a5c63cef47d 100644 --- a/src/header/grp/mod.rs +++ b/src/header/grp/mod.rs @@ -3,16 +3,20 @@ use core::{ convert::{TryFrom, TryInto}, mem, + num::ParseIntError, ops::{Deref, DerefMut}, pin::Pin, primitive::str, - ptr, slice, num::ParseIntError, str::Matches, + ptr, slice, + str::Matches, }; use lazy_static::lazy_static; -use alloc::{borrow::ToOwned, string::{String, FromUtf8Error}}; -use libc::strncmp; +use alloc::{ + borrow::ToOwned, + string::{FromUtf8Error, String}, +}; use crate::{ c_str::CStr, @@ -20,12 +24,12 @@ use crate::{ header::{errno, fcntl, string::strlen}, io, io::{prelude::*, BufReader, Lines}, - platform::types::*, platform, - sync::Mutex + platform::types::*, + sync::Mutex, }; -use super::errno::*; +use super::{errno::*, string::strncmp}; #[derive(Clone, Copy, Debug)] struct DestBuffer { @@ -70,7 +74,9 @@ static mut GROUP: group = group { gr_mem: ptr::null_mut(), }; -lazy_static! { static ref LINE_READER: Mutex<Option<Lines<BufReader<File>>>> = Mutex::new(None); } +lazy_static! { + static ref LINE_READER: Mutex<Option<Lines<BufReader<File>>>> = Mutex::new(None); +} #[repr(C)] #[derive(Debug)] @@ -89,7 +95,7 @@ enum Error { Misc(io::Error), FromUtf8Error(FromUtf8Error), ParseIntError(ParseIntError), - Other + Other, } #[derive(Debug)] @@ -111,18 +117,17 @@ impl OwnedGrp { fn split(buf: &mut [u8]) -> Option<group> { let gid = match buf[0..mem::size_of::<gid_t>()].try_into() { Ok(buf) => gid_t::from_ne_bytes(buf), - Err(err) => return None + Err(err) => return None, }; - + // We moved the gid to the beginning of the byte buffer so we can do this. let mut parts = buf[mem::size_of::<gid_t>()..].split_mut(|&c| c == b'\0'); - + Some(group { gr_name: parts.next()?.as_mut_ptr() as *mut i8, gr_passwd: parts.next()?.as_mut_ptr() as *mut i8, gr_gid: gid, - gr_mem: parts.next()?.as_mut_ptr() as *mut *mut c_char - // this will work because this points to the first string, which also happens to be the start of the array. The two are equivalent, just need to by typecast. + gr_mem: parts.next()?.as_mut_ptr() as *mut *mut c_char, // this will work because this points to the first string, which also happens to be the start of the array. The two are equivalent, just need to by typecast. }) } @@ -134,71 +139,72 @@ fn parse_grp(line: String, destbuf: Option<DestBuffer>) -> Result<OwnedGrp, Erro .map(|i| if i == b':' { b'\0' } else { i }) .chain([b'\0']) .collect::<Vec<_>>(); - let mut buffer = buffer - .split_mut(|i| *i == b'\0'); + let mut buffer = buffer.split_mut(|i| *i == b'\0'); let mut gr_gid: gid_t = 0; let strings = { let mut vec: Vec<u8> = Vec::new(); - + let gr_name = buffer.next().ok_or(Error::EOF)?.to_vec(); let gr_passwd = buffer.next().ok_or(Error::EOF)?.to_vec(); gr_gid = String::from_utf8(buffer.next().ok_or(Error::EOF)?.to_vec()) .map_err(|err| Error::FromUtf8Error(err))? .parse::<gid_t>() .map_err(|err| Error::ParseIntError(err))?; - + // Place the gid at the beginning of the byte buffer to make getting it back out again later, much faster. - + vec.extend(gr_gid.to_ne_bytes()); vec.extend(gr_name); vec.push(0); vec.extend(gr_passwd); vec.push(0); - - for i in buffer.next().ok_or(Error::EOF)? + + for i in buffer + .next() + .ok_or(Error::EOF)? .split(|b| *b == b',') - .filter(|i| i.len() > 0) { - + .filter(|i| i.len() > 0) + { vec.extend(i.to_vec()); vec.push(0); } - + vec.extend(0usize.to_ne_bytes()); - + vec }; - + let mut buffer = match destbuf { None => MaybeAllocated::Owned(Box::into_pin(strings.into_boxed_slice())), Some(buf) => { let mut buf = MaybeAllocated::Borrowed(buf); - + if buf.len() < buf.len() { - unsafe { platform::errno = errno::ERANGE; } + unsafe { + platform::errno = errno::ERANGE; + } return Err(Error::BufTooSmall); } - + buf[..strings.len()].copy_from_slice(&strings); buf } }; let reference = split(&mut buffer).ok_or(Error::Other)?; - - Ok(OwnedGrp { - buffer, - reference - }) + + Ok(OwnedGrp { buffer, reference }) } +// MT-Unsafe race:grgid locale #[no_mangle] -pub extern "C" fn getgrgid(gid: gid_t) -> *mut group { +pub unsafe extern "C" fn getgrgid(gid: gid_t) -> *mut group { let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return ptr::null_mut() }; for line in BufReader::new(db).lines() { let Ok(line) = line else { return ptr::null_mut() }; let Ok(grp) = parse_grp(line, None) else { return ptr::null_mut() }; - + if grp.reference.gr_gid == gid { return grp.into_global(); } @@ -207,17 +213,23 @@ pub extern "C" fn getgrgid(gid: gid_t) -> *mut group { return ptr::null_mut(); } +// MT-Unsafe race:grnam locale #[no_mangle] -pub extern "C" fn getgrnam(name: *const c_char) -> *mut group { +pub unsafe extern "C" fn getgrnam(name: *const c_char) -> *mut group { let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return ptr::null_mut() }; for line in BufReader::new(db).lines() { let Ok(line) = line else { return ptr::null_mut() }; - + let Ok(grp) = parse_grp(line, None) else { return ptr::null_mut() }; - + // Attempt to prevent BO vulnerabilities - if unsafe { strncmp(grp.reference.gr_name, name, strlen(grp.reference.gr_name).min(strlen(name))) > 0 } { + if strncmp( + grp.reference.gr_name, + name, + strlen(grp.reference.gr_name).min(strlen(name)), + ) > 0 + { return grp.into_global(); } } @@ -225,8 +237,15 @@ pub extern "C" fn getgrnam(name: *const c_char) -> *mut group { return ptr::null_mut(); } +// MT-Safe locale #[no_mangle] -pub extern "C" fn getgrgid_r(gid: gid_t, result_buf: *mut group, buffer: *mut c_char, buflen: usize, result: *mut *mut group) -> c_int { +pub unsafe extern "C" fn getgrgid_r( + gid: gid_t, + result_buf: *mut group, + buffer: *mut c_char, + buflen: usize, + result: *mut *mut group, +) -> c_int { let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return ENOENT }; for line in BufReader::new(db).lines() { @@ -234,78 +253,95 @@ pub extern "C" fn getgrgid_r(gid: gid_t, result_buf: *mut group, buffer: *mut c_ let Ok(mut grp) = parse_grp(line, Some(DestBuffer { ptr: buffer as *mut u8, len: buflen })) else { return EINVAL }; if grp.reference.gr_gid == gid { - unsafe { - *result_buf = grp.reference; - *result = result_buf; - }; - + *result_buf = grp.reference; + *result = result_buf; + return 0; } } - + return ENOENT; } +// MT-Safe locale #[no_mangle] -pub extern "C" fn getgrnam_r(name: *const c_char, result_buf: *mut group, buffer: *mut c_char, buflen: usize, result: *mut *mut group) -> c_int { +pub unsafe extern "C" fn getgrnam_r( + name: *const c_char, + result_buf: *mut group, + buffer: *mut c_char, + buflen: usize, + result: *mut *mut group, +) -> c_int { let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return ENOENT }; for line in BufReader::new(db).lines() { let Ok(line) = line else { return EINVAL }; let Ok(mut grp) = parse_grp(line, Some(DestBuffer { ptr: buffer as *mut u8, len: buflen })) else { return EINVAL }; - if unsafe { strncmp(grp.reference.gr_name, name, strlen(grp.reference.gr_name).min(strlen(name))) > 0 } { - unsafe { - *result_buf = grp.reference; - *result = result_buf; - }; - + if strncmp( + grp.reference.gr_name, + name, + strlen(grp.reference.gr_name).min(strlen(name)), + ) > 0 + { + *result_buf = grp.reference; + *result = result_buf; + return 0; } } - + return ENOENT; } +// MT-Unsafe race:grent race:grentbuf locale #[no_mangle] -pub extern "C" fn getgrent() -> *mut group { +pub unsafe extern "C" fn getgrent() -> *mut group { let mut line_reader = LINE_READER.lock(); - + if line_reader.is_none() { let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return ptr::null_mut() }; *line_reader = Some(BufReader::new(db).lines()); } - - if let Some(lines) = line_reader.deref_mut() { + + if let Some(lines) = line_reader.deref_mut() { let Some(line) = lines.next() else { return ptr::null_mut() }; let Ok(line) = line else { return ptr::null_mut() }; - + if let Ok(grp) = parse_grp(line, None) { return grp.into_global(); - } else { return ptr::null_mut(); } - + } else { + return ptr::null_mut(); + } } else { return ptr::null_mut(); } } +// MT-Unsafe race:grent locale #[no_mangle] -pub extern "C" fn endgrent() { +pub unsafe extern "C" fn endgrent() { let mut line_reader = LINE_READER.lock(); *line_reader = None; } +// MT-Unsafe race:grent locale #[no_mangle] -pub extern "C" fn setgrent() { - let mut line_reader = LINE_READER.lock(); +pub unsafe extern "C" fn setgrent() { + let mut line_reader = LINE_READER.lock(); let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return }; *line_reader = Some(BufReader::new(db).lines()); } #[no_mangle] -pub extern "C" fn getgrouplist(user: *const c_char, group: gid_t, groups: *mut gid_t, ngroups: i32) -> i32 { - let mut grps = unsafe { Vec::<gid_t>::from_raw_parts(groups, 0, ngroups as usize) }; - let Ok(usr) = (unsafe { crate::c_str::CStr::from_ptr(user).to_str() }) else { return 0 }; +pub unsafe extern "C" fn getgrouplist( + user: *const c_char, + group: gid_t, + groups: *mut gid_t, + ngroups: i32, +) -> i32 { + let mut grps = Vec::<gid_t>::from_raw_parts(groups, 0, ngroups as usize); + let Ok(usr) = (crate::c_str::CStr::from_ptr(user).to_str()) else { return 0 }; let Ok(db) = File::open(c_str!("/etc/group"), fcntl::O_RDONLY) else { return 0; }; diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index a6bf6b3e7375ab4091e49591c24e870eb6b1ab94..c1da8768a6971888af154579a756106d692c0c72 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -4,8 +4,13 @@ use core::{char, ffi::VaList as va_list, mem, ptr, slice, usize}; use crate::{ header::{ - ctype::isspace, errno::{ERANGE, EILSEQ, ENOMEM}, stdio::*, - stdlib::{MB_CUR_MAX, MB_LEN_MAX, malloc}, string, time::*, wctype::*, + ctype::isspace, + errno::{EILSEQ, ENOMEM, ERANGE}, + stdio::*, + stdlib::{malloc, MB_CUR_MAX, MB_LEN_MAX}, + string, + time::*, + wctype::*, }, platform::{self, errno, types::*}, }; @@ -46,8 +51,13 @@ pub unsafe extern "C" fn fgetwc(stream: *mut FILE) -> wint_t { let mut wc: wchar_t = 0; loop { - let nread = fread(buf[bytes_read..bytes_read+1].as_mut_ptr() as *mut c_void, 1, 1, stream); - + let nread = fread( + buf[bytes_read..bytes_read + 1].as_mut_ptr() as *mut c_void, + 1, + 1, + stream, + ); + if nread != 1 { errno = EILSEQ; return WEOF; @@ -75,7 +85,12 @@ pub unsafe extern "C" fn fgetwc(stream: *mut FILE) -> wint_t { } } - mbrtowc(&mut wc, buf.as_ptr() as *const c_char, encoded_length, ptr::null_mut()); + mbrtowc( + &mut wc, + buf.as_ptr() as *const c_char, + encoded_length, + ptr::null_mut(), + ); wc as wint_t } @@ -281,8 +296,8 @@ pub unsafe extern "C" fn ungetwc(wc: wint_t, stream: &mut FILE) -> wint_t { return WEOF; } - /* - We might have unget multiple bytes for a single wchar, eg, `ç` is [195, 167]. + /* + We might have unget multiple bytes for a single wchar, eg, `ç` is [195, 167]. We need to unget them in reversed, so they are pused as [..., 167, 195, ...] When we do fgetwc, we pop from the Vec, getting the write order of bytes [195, 167]. If we called ungetc in the non-reversed order, we would get [167, 195] @@ -327,19 +342,12 @@ pub unsafe extern "C" fn vswprintf( } #[no_mangle] -pub unsafe extern "C" fn wcpcpy( - d: *mut wchar_t, - s: *const wchar_t, -) -> *mut wchar_t { +pub unsafe extern "C" fn wcpcpy(d: *mut wchar_t, s: *const wchar_t) -> *mut wchar_t { return (wcscpy(d, s)).offset(wcslen(s) as isize); } #[no_mangle] -pub unsafe extern "C" fn wcpncpy( - d: *mut wchar_t, - s: *const wchar_t, - n: size_t, -) -> *mut wchar_t { +pub unsafe extern "C" fn wcpncpy(d: *mut wchar_t, s: *const wchar_t, n: size_t) -> *mut wchar_t { return (wcsncpy(d, s, n)).offset(wcsnlen(s, n) as isize); } @@ -359,8 +367,8 @@ pub unsafe extern "C" fn wcrtomb(s: *mut c_char, wc: wchar_t, ps: *mut mbstate_t #[no_mangle] pub unsafe extern "C" fn wcsdup(s: *const wchar_t) -> *mut wchar_t { let l = wcslen(s); - - let d = malloc((l + 1)*mem::size_of::<wchar_t>()) as *mut wchar_t; + + let d = malloc((l + 1) * mem::size_of::<wchar_t>()) as *mut wchar_t; if d.is_null() { errno = ENOMEM; @@ -521,7 +529,7 @@ pub unsafe extern "C" fn wcsncpy( #[no_mangle] pub unsafe extern "C" fn wcsnlen(mut s: *const wchar_t, maxlen: size_t) -> size_t { let mut len = 0; - + while len < maxlen { if *s == 0 { break; @@ -550,10 +558,10 @@ pub unsafe extern "C" fn wcsnrtombs( if ps.is_null() { ps = &mut mbs; } - + while read < nwc { buf.fill(0); - + let ret = wcrtomb(buf.as_mut_ptr(), **src, ps); if ret == size_t::MAX { @@ -574,7 +582,7 @@ pub unsafe extern "C" fn wcsnrtombs( *src = ptr::null(); return written; } - + *src = (*src).add(1); read += 1; written += ret; @@ -582,7 +590,6 @@ pub unsafe extern "C" fn wcsnrtombs( written } - #[no_mangle] pub unsafe extern "C" fn wcspbrk(mut wcs: *const wchar_t, set: *const wchar_t) -> *mut wchar_t { wcs = wcs.add(wcscspn(wcs, set)); diff --git a/src/platform/redox/exec.rs b/src/platform/redox/exec.rs index b327f7193a7a52c0547c17396ce294a5c1c90f1f..f0375437300a5891905893efe17d55d9b36a0963 100644 --- a/src/platform/redox/exec.rs +++ b/src/platform/redox/exec.rs @@ -93,7 +93,10 @@ pub fn execve( // NOTE: We must omit O_CLOEXEC and close manually, otherwise it will be closed before we // have even read it! let (mut image_file, arg0) = match exec { - Executable::AtPath(path) => (File::open(path, O_RDONLY as c_int).map_err(|_| Error::new(ENOENT))?, path.to_bytes()), + Executable::AtPath(path) => ( + File::open(path, O_RDONLY as c_int).map_err(|_| Error::new(ENOENT))?, + path.to_bytes(), + ), Executable::InFd { file, arg0 } => (file, arg0), }; diff --git a/src/platform/redox/libredox.rs b/src/platform/redox/libredox.rs index 07d0fe54466e08e7df1080943639dc04b6b4c842..337d9329791f44a852b4de9d70f52c694b43bb5e 100644 --- a/src/platform/redox/libredox.rs +++ b/src/platform/redox/libredox.rs @@ -1,9 +1,11 @@ use core::{slice, str}; -use libc::{c_int, mode_t}; -use syscall::{Error, Result, EMFILE, WaitFlags}; +use syscall::{Error, Result, WaitFlags, EMFILE}; -use crate::header::signal::sigaction; +use crate::{ + header::signal::sigaction, + platform::types::{c_int, mode_t}, +}; pub type RawResult = usize; @@ -13,15 +15,26 @@ pub fn open(path: &str, oflag: c_int, mode: mode_t) -> Result<usize> { ((oflag as usize) & 0xFFFF_0000) | ((mode as usize) & 0xFFFF), )?; - c_int::try_from(usize_fd).map_err(|_| { - let _ = syscall::close(usize_fd); - Error::new(EMFILE) - }).map(|f| f as usize) + c_int::try_from(usize_fd) + .map_err(|_| { + let _ = syscall::close(usize_fd); + Error::new(EMFILE) + }) + .map(|f| f as usize) } #[no_mangle] -pub unsafe extern "C" fn redox_open_v1(path_base: *const u8, path_len: usize, flags: u32, mode: u16) -> RawResult { - Error::mux(open(str::from_utf8_unchecked(slice::from_raw_parts(path_base, path_len)), flags as c_int, mode as mode_t)) +pub unsafe extern "C" fn redox_open_v1( + path_base: *const u8, + path_len: usize, + flags: u32, + mode: u16, +) -> RawResult { + Error::mux(open( + str::from_utf8_unchecked(slice::from_raw_parts(path_base, path_len)), + flags as c_int, + mode as mode_t, + )) } #[no_mangle] @@ -29,15 +42,31 @@ pub unsafe extern "C" fn redox_dup_v1(fd: usize, buf: *const u8, len: usize) -> Error::mux(syscall::dup(fd, core::slice::from_raw_parts(buf, len))) } #[no_mangle] -pub unsafe extern "C" fn redox_dup2_v1(old_fd: usize, new_fd: usize, buf: *const u8, len: usize) -> RawResult { - Error::mux(syscall::dup2(old_fd, new_fd, core::slice::from_raw_parts(buf, len))) +pub unsafe extern "C" fn redox_dup2_v1( + old_fd: usize, + new_fd: usize, + buf: *const u8, + len: usize, +) -> RawResult { + Error::mux(syscall::dup2( + old_fd, + new_fd, + core::slice::from_raw_parts(buf, len), + )) } #[no_mangle] pub unsafe extern "C" fn redox_read_v1(fd: usize, dst_base: *mut u8, dst_len: usize) -> RawResult { - Error::mux(syscall::read(fd, slice::from_raw_parts_mut(dst_base, dst_len))) + Error::mux(syscall::read( + fd, + slice::from_raw_parts_mut(dst_base, dst_len), + )) } #[no_mangle] -pub unsafe extern "C" fn redox_write_v1(fd: usize, src_base: *const u8, src_len: usize) -> RawResult { +pub unsafe extern "C" fn redox_write_v1( + fd: usize, + src_base: *const u8, + src_len: usize, +) -> RawResult { Error::mux(syscall::write(fd, slice::from_raw_parts(src_base, src_len))) } #[no_mangle] @@ -59,7 +88,10 @@ pub unsafe extern "C" fn redox_fchown_v1(fd: usize, new_uid: u32, new_gid: u32) } #[no_mangle] pub unsafe extern "C" fn redox_fpath_v1(fd: usize, dst_base: *mut u8, dst_len: usize) -> RawResult { - Error::mux(syscall::fpath(fd, core::slice::from_raw_parts_mut(dst_base, dst_len))) + Error::mux(syscall::fpath( + fd, + core::slice::from_raw_parts_mut(dst_base, dst_len), + )) } #[no_mangle] pub unsafe extern "C" fn redox_close_v1(fd: usize) -> RawResult { @@ -94,7 +126,11 @@ pub unsafe extern "C" fn redox_setrens_v1(rns: usize, ens: usize) -> RawResult { #[no_mangle] pub unsafe extern "C" fn redox_waitpid_v1(pid: usize, status: *mut i32, options: u32) -> RawResult { let mut sts = 0_usize; - let res = Error::mux(syscall::waitpid(pid, &mut sts, WaitFlags::from_bits_truncate(options as usize))); + let res = Error::mux(syscall::waitpid( + pid, + &mut sts, + WaitFlags::from_bits_truncate(options as usize), + )); status.write(sts as i32); res } @@ -105,11 +141,19 @@ pub unsafe extern "C" fn redox_kill_v1(pid: usize, signal: u32) -> RawResult { } #[no_mangle] -pub unsafe extern "C" fn redox_sigaction_v1(signal: u32, new: *const sigaction, old: *mut sigaction) -> RawResult { +pub unsafe extern "C" fn redox_sigaction_v1( + signal: u32, + new: *const sigaction, + old: *mut sigaction, +) -> RawResult { Error::mux(super::signal::sigaction_impl(signal as i32, new.as_ref(), old.as_mut()).map(|()| 0)) } #[no_mangle] -pub unsafe extern "C" fn redox_sigprocmask_v1(how: u32, new: *const u64, old: *mut u64) -> RawResult { +pub unsafe extern "C" fn redox_sigprocmask_v1( + how: u32, + new: *const u64, + old: *mut u64, +) -> RawResult { Error::mux(super::signal::sigprocmask_impl(how as i32, new, old).map(|()| 0)) } diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 14e93760a2c2f8f541d84467e638a3ca76fa442d..a532de7fbbbc7f5b44038e1975d390311660e93d 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -63,7 +63,7 @@ macro_rules! path_from_c_str { }}; } -use self::{path::canonicalize, exec::Executable}; +use self::{exec::Executable, path::canonicalize}; pub fn e(sys: Result<usize>) -> usize { match sys { @@ -207,7 +207,10 @@ impl Pal for Sys { fn clock_settime(clk_id: clockid_t, tp: *const timespec) -> c_int { // TODO - eprintln!("relibc clock_settime({}, {:p}): not implemented", clk_id, tp); + eprintln!( + "relibc clock_settime({}, {:p}): not implemented", + clk_id, tp + ); unsafe { errno = ENOSYS }; -1 } @@ -238,7 +241,10 @@ impl Pal for Sys { } unsafe fn fexecve(fildes: c_int, argv: *const *mut c_char, envp: *const *mut c_char) -> c_int { e(self::exec::execve( - Executable::InFd { file: File::new(fildes), arg0: CStr::from_ptr(argv.read()).to_bytes() }, + Executable::InFd { + file: File::new(fildes), + arg0: CStr::from_ptr(argv.read()).to_bytes(), + }, self::exec::ArgEnv::C { argv, envp }, None, )) as c_int @@ -573,7 +579,10 @@ impl Pal for Sys { unsafe fn getrlimit(resource: c_int, rlim: *mut rlimit) -> c_int { //TODO - eprintln!("relibc getrlimit({}, {:p}): not implemented", resource, rlim); + eprintln!( + "relibc getrlimit({}, {:p}): not implemented", + resource, rlim + ); if !rlim.is_null() { (*rlim).rlim_cur = RLIM_INFINITY; (*rlim).rlim_max = RLIM_INFINITY; @@ -583,7 +592,10 @@ impl Pal for Sys { unsafe fn setrlimit(resource: c_int, rlim: *const rlimit) -> c_int { //TOOD - eprintln!("relibc setrlimit({}, {:p}): not implemented", resource, rlim); + eprintln!( + "relibc setrlimit({}, {:p}): not implemented", + resource, rlim + ); unsafe { errno = EPERM }; -1 } @@ -715,7 +727,10 @@ impl Pal for Sys { } unsafe fn msync(addr: *mut c_void, len: usize, flags: c_int) -> c_int { - eprintln!("relibc msync({:p}, 0x{:x}, 0x{:x}): not implemented", addr, len, flags); + eprintln!( + "relibc msync({:p}, 0x{:x}, 0x{:x}): not implemented", + addr, len, flags + ); e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int /* TODO e(syscall::msync( @@ -744,7 +759,10 @@ impl Pal for Sys { } unsafe fn madvise(addr: *mut c_void, len: usize, flags: c_int) -> c_int { - eprintln!("relibc madvise({:p}, 0x{:x}, 0x{:x}): not implemented", addr, len, flags); + eprintln!( + "relibc madvise({:p}, 0x{:x}, 0x{:x}): not implemented", + addr, len, flags + ); e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int } @@ -850,7 +868,10 @@ impl Pal for Sys { fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int { // TODO - eprintln!("relibc setpriority({}, {}, {}): not implemented", which, who, prio); + eprintln!( + "relibc setpriority({}, {}, {}): not implemented", + which, who, prio + ); unsafe { errno = ENOSYS }; -1 } diff --git a/src/platform/redox/redox-exec/src/lib.rs b/src/platform/redox/redox-exec/src/lib.rs index 7420c22b5f7408531bb1d193889e0540d7e4c9bd..a5c049baf1d64353c9c5d24d4c5cd0ba75d6ed9a 100644 --- a/src/platform/redox/redox-exec/src/lib.rs +++ b/src/platform/redox/redox-exec/src/lib.rs @@ -23,8 +23,8 @@ use goblin::elf64::{ use syscall::{ error::*, flag::{MapFlags, SEEK_SET}, - PAGE_SIZE, Map, PROT_WRITE, O_CLOEXEC, - GrantDesc, GrantFlags, PROT_READ, PROT_EXEC, MAP_SHARED, MAP_FIXED_NOREPLACE, + GrantDesc, GrantFlags, Map, MAP_FIXED_NOREPLACE, MAP_SHARED, O_CLOEXEC, PAGE_SIZE, PROT_EXEC, + PROT_READ, PROT_WRITE, }; pub use self::arch::*; @@ -174,13 +174,8 @@ where let (first_aligned_page, remaining_filesz) = if voff > 0 { let bytes_to_next_page = PAGE_SIZE - voff; - let (_guard, dst_page) = unsafe { - MmapGuard::map_mut_anywhere( - *grants_fd, - vaddr, - PAGE_SIZE, - )? - }; + let (_guard, dst_page) = + unsafe { MmapGuard::map_mut_anywhere(*grants_fd, vaddr, PAGE_SIZE)? }; let length = core::cmp::min(bytes_to_next_page, filesz); @@ -209,16 +204,19 @@ where // Use commented out lines to trigger kernel bug (FIXME). //let pages_in_this_group = core::cmp::min(PAGES_PER_ITER, file_page_count - page_idx * PAGES_PER_ITER); - let pages_in_this_group = core::cmp::min(PAGES_PER_ITER, remaining_page_count - page_idx); + let pages_in_this_group = + core::cmp::min(PAGES_PER_ITER, remaining_page_count - page_idx); - if pages_in_this_group == 0 { break } + if pages_in_this_group == 0 { + break; + } // TODO: MAP_FIXED to optimize away funmap? let (_guard, dst_memory) = unsafe { MmapGuard::map_mut_anywhere( *grants_fd, first_aligned_page + page_idx * PAGE_SIZE, // offset - pages_in_this_group * PAGE_SIZE, // size + pages_in_this_group * PAGE_SIZE, // size )? }; @@ -290,7 +288,11 @@ where }; unsafe { - page.as_mut_ptr_slice().as_mut_ptr().add(new_page_off).cast::<usize>().write(word); + page.as_mut_ptr_slice() + .as_mut_ptr() + .add(new_page_off) + .cast::<usize>() + .write(word); } Ok(()) @@ -312,11 +314,8 @@ where MapFlags::PROT_READ | MapFlags::PROT_WRITE, )?; unsafe { - let (_guard, memory) = MmapGuard::map_mut_anywhere( - *grants_fd, - pheaders, - pheaders_size_aligned, - )?; + let (_guard, memory) = + MmapGuard::map_mut_anywhere(*grants_fd, pheaders, pheaders_size_aligned)?; memory[..pheaders_to_convey.len()].copy_from_slice(pheaders_to_convey); } @@ -380,11 +379,7 @@ where let aligned_size = size.next_multiple_of(PAGE_SIZE); let (_guard, memory) = unsafe { - MmapGuard::map_mut_anywhere( - *grants_fd, - containing_page, - aligned_size, - )? + MmapGuard::map_mut_anywhere(*grants_fd, containing_page, aligned_size)? }; memory[displacement..][..source_slice.len()].copy_from_slice(source_slice); } @@ -606,22 +601,34 @@ impl MmapGuard { flags.remove(MapFlags::MAP_FIXED_NOREPLACE); flags.insert(MapFlags::MAP_FIXED); - let _new_base = unsafe { syscall::fmap(self.fd, &Map { - offset, - size: self.size, - flags, - address: self.base, - })? }; + let _new_base = unsafe { + syscall::fmap( + self.fd, + &Map { + offset, + size: self.size, + flags, + address: self.base, + }, + )? + }; Ok(()) } - pub unsafe fn map_mut_anywhere<'a>(fd: usize, offset: usize, size: usize) -> Result<(Self, &'a mut [u8])> { - let mut this = Self::map(fd, &Map { - size, - offset, - address: 0, - flags: PROT_WRITE, - })?; + pub unsafe fn map_mut_anywhere<'a>( + fd: usize, + offset: usize, + size: usize, + ) -> Result<(Self, &'a mut [u8])> { + let mut this = Self::map( + fd, + &Map { + size, + offset, + address: 0, + flags: PROT_WRITE, + }, + )?; let slice = &mut *this.as_mut_ptr_slice(); Ok((this, slice)) @@ -704,10 +711,7 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { let (cur_filetable_fd, new_pid_fd, new_pid); { - let cur_pid_fd = FdGuard::new(syscall::open( - "thisproc:current/open_via_dup", - O_CLOEXEC, - )?); + let cur_pid_fd = FdGuard::new(syscall::open("thisproc:current/open_via_dup", O_CLOEXEC)?); (new_pid_fd, new_pid) = new_context()?; // Do not allocate new signal stack, but copy existing address (all memory will be re-mapped @@ -759,7 +763,12 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { let mut grant_desc_buf = [GrantDesc::default(); 16]; loop { let bytes_read = { - let buf = unsafe { core::slice::from_raw_parts_mut(grant_desc_buf.as_mut_ptr().cast(), grant_desc_buf.len() * size_of::<GrantDesc>()) }; + let buf = unsafe { + core::slice::from_raw_parts_mut( + grant_desc_buf.as_mut_ptr().cast(), + grant_desc_buf.len() * size_of::<GrantDesc>(), + ) + }; syscall::read(*cur_addr_space_fd, buf)? }; if bytes_read == 0 { @@ -769,7 +778,9 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { let grants = &grant_desc_buf[..bytes_read / size_of::<GrantDesc>()]; for grant in grants { - if !grant.flags.contains(GrantFlags::GRANT_SCHEME) || !grant.flags.contains(GrantFlags::GRANT_SHARED) { + if !grant.flags.contains(GrantFlags::GRANT_SCHEME) + || !grant.flags.contains(GrantFlags::GRANT_SHARED) + { continue; } @@ -846,10 +857,7 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { pub fn new_context() -> Result<(FdGuard, usize)> { // Create a new context (fields such as uid/gid will be inherited from the current context). - let fd = FdGuard::new(syscall::open( - "thisproc:new/open_via_dup", - O_CLOEXEC, - )?); + let fd = FdGuard::new(syscall::open("thisproc:new/open_via_dup", O_CLOEXEC)?); // Extract pid. let mut buffer = [0_u8; 64]; diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index 0b36869b736c4cb3736db68fdc12c8e0ff220aa4..da53f619d23f207bcbf73fa11ee478b080d97c52 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -140,7 +140,11 @@ impl PalSignal for Sys { } } -pub(crate) fn sigaction_impl(sig: i32, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> Result<()> { +pub(crate) fn sigaction_impl( + sig: i32, + act: Option<&sigaction>, + oact: Option<&mut sigaction>, +) -> Result<()> { let new_opt = act.map(|act| { let m = act.sa_mask; let sa_handler = unsafe { mem::transmute(act.sa_handler) }; @@ -152,11 +156,7 @@ pub(crate) fn sigaction_impl(sig: i32, act: Option<&sigaction>, oact: Option<&mu } }); let mut old_opt = oact.as_ref().map(|_| syscall::SigAction::default()); - syscall::sigaction( - sig as usize, - new_opt.as_ref(), - old_opt.as_mut(), - )?; + syscall::sigaction(sig as usize, new_opt.as_ref(), old_opt.as_mut())?; if let (Some(old), Some(oact)) = (old_opt, oact) { oact.sa_handler = unsafe { mem::transmute(old.sa_handler) }; let m = old.sa_mask; @@ -172,11 +172,7 @@ pub(crate) fn sigprocmask_impl(how: i32, set: *const sigset_t, oset: *mut sigset Some([unsafe { *set as u64 }, 0]) }; let mut old_opt = if oset.is_null() { None } else { Some([0, 0]) }; - syscall::sigprocmask( - how as usize, - new_opt.as_ref(), - old_opt.as_mut(), - )?; + syscall::sigprocmask(how as usize, new_opt.as_ref(), old_opt.as_mut())?; if let Some(old) = old_opt { unsafe { *oset = old[0] as sigset_t }; }