Merge branch 'use_libc_crate_correctly' into 'master'
Use libc crate correctly, and future-proof See merge request redox-os/relibc!429
This commit is contained in:
Generated
+38
-127
@@ -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"
|
||||
|
||||
+2
-3
@@ -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" }
|
||||
|
||||
@@ -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")
|
||||
|
||||
+1
-1
Submodule posix-regex updated: 0d996efe5c...df45954609
@@ -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);
|
||||
|
||||
|
||||
+103
-67
@@ -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; };
|
||||
|
||||
|
||||
+30
-23
@@ -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));
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user