Merge remote-tracking branch 'origin/master' into feature/metering

This commit is contained in:
losfair 2019-05-29 11:16:05 +08:00
commit fd8675324c
21 changed files with 244 additions and 1193 deletions

View File

@ -64,6 +64,7 @@ build_script:
- rename target wapm-cli-target - rename target wapm-cli-target
- cd .. - cd ..
- move wapm-cli\wapm-cli-target wapm-cli-target - move wapm-cli\wapm-cli-target wapm-cli-target
- cargo build --release --manifest-path lib/runtime-c-api/Cargo.toml
test_script: test_script:
- cargo test --manifest-path lib/spectests/Cargo.toml --features clif - cargo test --manifest-path lib/spectests/Cargo.toml --features clif

View File

@ -30,7 +30,6 @@ jobs:
- restore_cache: - restore_cache:
keys: keys:
- v8-lint-{{ arch }}-{{ checksum "Cargo.lock" }} - v8-lint-{{ arch }}-{{ checksum "Cargo.lock" }}
- v8-lint-{{ arch }}
- <<: *run_install_dependencies - <<: *run_install_dependencies
- run: - run:
name: Install lint deps name: Install lint deps
@ -88,7 +87,6 @@ jobs:
- restore_cache: - restore_cache:
keys: keys:
- v8-cargo-cache-darwin-stable-{{ arch }}-{{ checksum "Cargo.lock" }} - v8-cargo-cache-darwin-stable-{{ arch }}-{{ checksum "Cargo.lock" }}
# - v8-cargo-cache-darwin-stable-{{ arch }}
- run: - run:
name: Install crate dependencies name: Install crate dependencies
command: | command: |
@ -193,6 +191,11 @@ jobs:
echo "${CIRCLE_TAG}" >> artifacts/git_version echo "${CIRCLE_TAG}" >> artifacts/git_version
make build-install make build-install
cp ./wasmer.tar.gz ./artifacts/$(./binary-name.sh) cp ./wasmer.tar.gz ./artifacts/$(./binary-name.sh)
- run:
name: Dynamic library
command: |
cargo build --release --manifest-path lib/runtime-c-api/Cargo.toml
cp target/release/libwasmer_runtime_c_api.so ./artifacts
- persist_to_workspace: - persist_to_workspace:
root: . root: .
paths: paths:
@ -280,6 +283,12 @@ jobs:
cp ./wasmer.tar.gz ./artifacts/$(./binary-name.sh) cp ./wasmer.tar.gz ./artifacts/$(./binary-name.sh)
# VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) # VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
# echo "${VERSION}" >> artifacts/version # echo "${VERSION}" >> artifacts/version
- run:
name: Dynamic library
command: |
export PATH="$HOME/.cargo/bin:$PATH"
cargo build --release --manifest-path lib/runtime-c-api/Cargo.toml
cp target/release/libwasmer_runtime_c_api.dylib ./artifacts
- persist_to_workspace: - persist_to_workspace:
root: . root: .
paths: paths:
@ -353,7 +362,7 @@ jobs:
# VERSION_TAG=$(git describe --exact-match --tags) # VERSION_TAG=$(git describe --exact-match --tags)
#if [ "$VERSION" == "$VERSION_TAG" ]; then #if [ "$VERSION" == "$VERSION_TAG" ]; then
# echo "Versions match, publishing to Github" # echo "Versions match, publishing to Github"
ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -soft ${VERSION} ./artifacts/ ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} ${VERSION} ./artifacts/
#else #else
# echo "Versions don't match. Wasmer output version (wasmer --version) is ${VERSION} while Git tag is ${VERSION_TAG}" # echo "Versions don't match. Wasmer output version (wasmer --version) is ${VERSION} while Git tag is ${VERSION_TAG}"
# exit 1 # exit 1

View File

@ -6,6 +6,7 @@ Blocks of changes will separated by version increments.
## **[Unreleased]** ## **[Unreleased]**
- [#467](https://github.com/wasmerio/wasmer/pull/467) `wasmer_instantiate` returns better error messages in the runtime C API
- [#463](https://github.com/wasmerio/wasmer/pull/463) Fix bug in WASI path_open allowing one level above preopened dir to be accessed - [#463](https://github.com/wasmerio/wasmer/pull/463) Fix bug in WASI path_open allowing one level above preopened dir to be accessed
- [#461](https://github.com/wasmerio/wasmer/pull/461) Prevent passing negative lengths in various places in the runtime C API - [#461](https://github.com/wasmerio/wasmer/pull/461) Prevent passing negative lengths in various places in the runtime C API
- [#459](https://github.com/wasmerio/wasmer/pull/459) Add monotonic and real time clocks for wasi on windows - [#459](https://github.com/wasmerio/wasmer/pull/459) Add monotonic and real time clocks for wasi on windows

1140
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,7 @@ wasmer-clif-backend = { path = "lib/clif-backend" }
wasmer-singlepass-backend = { path = "lib/singlepass-backend", optional = true } wasmer-singlepass-backend = { path = "lib/singlepass-backend", optional = true }
wasmer-middleware-common = { path = "lib/middleware-common" } wasmer-middleware-common = { path = "lib/middleware-common" }
wasmer-runtime = { path = "lib/runtime" } wasmer-runtime = { path = "lib/runtime" }
wasmer-runtime-abi = { path = "lib/runtime-abi", optional = true } # wasmer-runtime-abi = { path = "lib/runtime-abi", optional = true }
wasmer-runtime-core = { path = "lib/runtime-core" } wasmer-runtime-core = { path = "lib/runtime-core" }
wasmer-emscripten = { path = "lib/emscripten" } wasmer-emscripten = { path = "lib/emscripten" }
wasmer-llvm-backend = { path = "lib/llvm-backend", optional = true } wasmer-llvm-backend = { path = "lib/llvm-backend", optional = true }
@ -37,7 +37,24 @@ wasmer-kernel-loader = { path = "lib/kernel-loader", optional = true }
wasmer-dev-utils = { path = "lib/dev-utils", optional = true } wasmer-dev-utils = { path = "lib/dev-utils", optional = true }
[workspace] [workspace]
members = ["lib/clif-backend", "lib/singlepass-backend", "lib/runtime", "lib/runtime-abi", "lib/runtime-core", "lib/emscripten", "lib/spectests", "lib/win-exception-handler", "lib/runtime-c-api", "lib/llvm-backend", "lib/wasi", "lib/middleware-common", "lib/kernel-loader", "lib/kernel-net", "lib/dev-utils", "examples/plugin-for-example"] members = [
"lib/clif-backend",
"lib/singlepass-backend",
"lib/runtime",
# "lib/runtime-abi",
"lib/runtime-core",
"lib/emscripten",
"lib/spectests",
"lib/win-exception-handler",
"lib/runtime-c-api",
"lib/llvm-backend",
"lib/wasi",
"lib/middleware-common",
"lib/kernel-loader",
"lib/kernel-net",
"lib/dev-utils",
"examples/plugin-for-example"
]
[build-dependencies] [build-dependencies]
wabt = "0.7.2" wabt = "0.7.2"
@ -55,7 +72,7 @@ fast-tests = []
"backend:llvm" = ["wasmer-llvm-backend"] "backend:llvm" = ["wasmer-llvm-backend"]
"backend:singlepass" = ["wasmer-singlepass-backend"] "backend:singlepass" = ["wasmer-singlepass-backend"]
wasi = ["wasmer-wasi"] wasi = ["wasmer-wasi"]
vfs = ["wasmer-runtime-abi"] # vfs = ["wasmer-runtime-abi"]
[[example]] [[example]]
name = "plugin" name = "plugin"

View File

@ -28,7 +28,7 @@ curl https://get.wasmer.io -sSfL | sh
Wasmer runtime can also be embedded in different languages, so you can use WebAssembly anywhere ✨: Wasmer runtime can also be embedded in different languages, so you can use WebAssembly anywhere ✨:
* [**Rust**](https://github.com/wasmerio/wasmer-rust-example) * [🦀 **Rust**](https://github.com/wasmerio/wasmer-rust-example)
* [**C/C++**](https://github.com/wasmerio/wasmer-c-api) * [**C/C++**](https://github.com/wasmerio/wasmer-c-api)
* [**🐘 PHP**](https://github.com/wasmerio/php-ext-wasm) * [**🐘 PHP**](https://github.com/wasmerio/php-ext-wasm)
* [**🐍 Python**](https://github.com/wasmerio/python-ext-wasm) * [**🐍 Python**](https://github.com/wasmerio/python-ext-wasm)

19
SECURITY.md Normal file
View File

@ -0,0 +1,19 @@
# Security Policy
## Supported Versions
While in beta, the latest published version of `wasmer` (`0.x`) will be supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 0.x | :white_check_mark: |
## Reporting a Vulnerability
The Wasmer team and community take security bugs in Wasmer seriously.
We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
To report a security issue, email security@wasmer.io and include the word "SECURITY" in the subject line.
The Wasmer team will send a response indicating the next steps in handling your report.
After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.

View File

@ -15,7 +15,7 @@ cranelift-entity = "0.30.0"
cranelift-wasm = "0.30.0" cranelift-wasm = "0.30.0"
hashbrown = "0.1" hashbrown = "0.1"
target-lexicon = "0.3.0" target-lexicon = "0.3.0"
wasmparser = "0.29.2" wasmparser = "0.30.0"
byteorder = "1" byteorder = "1"
nix = "0.13.0" nix = "0.13.0"
libc = "0.2.49" libc = "0.2.49"

View File

@ -10,6 +10,8 @@ pub use self::unix::*;
#[cfg(windows)] #[cfg(windows)]
pub use self::windows::*; pub use self::windows::*;
use libc::c_char;
use crate::{allocate_on_stack, EmscriptenData}; use crate::{allocate_on_stack, EmscriptenData};
use std::os::raw::c_int; use std::os::raw::c_int;
use wasmer_runtime_core::vm::Ctx; use wasmer_runtime_core::vm::Ctx;
@ -112,3 +114,41 @@ pub fn ___assert_fail(_ctx: &mut Ctx, _a: c_int, _b: c_int, _c: c_int, _d: c_int
// TODO: Implement like emscripten expects regarding memory/page size // TODO: Implement like emscripten expects regarding memory/page size
// TODO raise an error // TODO raise an error
} }
pub fn _pathconf(ctx: &mut Ctx, path_addr: c_int, name: c_int) -> c_int {
debug!(
"emscripten::_pathconf {} {} - UNIMPLEMENTED",
path_addr, name
);
let _path = emscripten_memory_pointer!(ctx.memory(0), path_addr) as *const c_char;
match name {
0 => 32000,
1 | 2 | 3 => 255,
4 | 5 | 16 | 17 | 18 => 4096,
6 | 7 | 20 => 1,
8 => 0,
9 | 10 | 11 | 12 | 14 | 15 | 19 => -1,
13 => 64,
_ => {
// ___setErrNo(22);
-1
}
}
}
pub fn _fpathconf(_ctx: &mut Ctx, _fildes: c_int, name: c_int) -> c_int {
debug!("emscripten::_fpathconf {} {}", _fildes, name);
match name {
0 => 32000,
1 | 2 | 3 => 255,
4 | 5 | 16 | 17 | 18 => 4096,
6 | 7 | 20 => 1,
8 => 0,
9 | 10 | 11 | 12 | 14 | 15 | 19 => -1,
13 => 64,
_ => {
// ___setErrNo(22);
-1
}
}
}

View File

@ -545,6 +545,8 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
"_sysconf" => func!(crate::env::_sysconf), "_sysconf" => func!(crate::env::_sysconf),
"_getaddrinfo" => func!(crate::env::_getaddrinfo), "_getaddrinfo" => func!(crate::env::_getaddrinfo),
"_times" => func!(crate::env::_times), "_times" => func!(crate::env::_times),
"_pathconf" => func!(crate::env::_pathconf),
"_fpathconf" => func!(crate::env::_fpathconf),
// Syscalls // Syscalls
"___syscall1" => func!(crate::syscalls::___syscall1), "___syscall1" => func!(crate::syscalls::___syscall1),
@ -687,6 +689,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
"_asctime_r" => func!(crate::time::_asctime_r), "_asctime_r" => func!(crate::time::_asctime_r),
"_localtime" => func!(crate::time::_localtime), "_localtime" => func!(crate::time::_localtime),
"_time" => func!(crate::time::_time), "_time" => func!(crate::time::_time),
"_timegm" => func!(crate::time::_timegm),
"_strftime" => func!(crate::time::_strftime), "_strftime" => func!(crate::time::_strftime),
"_strftime_l" => func!(crate::time::_strftime_l), "_strftime_l" => func!(crate::time::_strftime_l),
"_localtime_r" => func!(crate::time::_localtime_r), "_localtime_r" => func!(crate::time::_localtime_r),
@ -705,6 +708,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject
"_llvm_exp2_f32" => func!(crate::math::_llvm_exp2_f32), "_llvm_exp2_f32" => func!(crate::math::_llvm_exp2_f32),
"_llvm_exp2_f64" => func!(crate::math::_llvm_exp2_f64), "_llvm_exp2_f64" => func!(crate::math::_llvm_exp2_f64),
"_llvm_trunc_f64" => func!(crate::math::_llvm_trunc_f64), "_llvm_trunc_f64" => func!(crate::math::_llvm_trunc_f64),
"_llvm_fma_f64" => func!(crate::math::_llvm_fma_f64),
"_emscripten_random" => func!(crate::math::_emscripten_random), "_emscripten_random" => func!(crate::math::_emscripten_random),
// Jump // Jump

View File

@ -49,6 +49,11 @@ pub fn _llvm_trunc_f64(_ctx: &mut Ctx, value: f64) -> f64 {
value.trunc() value.trunc()
} }
pub fn _llvm_fma_f64(_ctx: &mut Ctx, value: f64, a: f64, b: f64) -> f64 {
debug!("emscripten::_llvm_fma_f64");
value.mul_add(a, b)
}
pub fn _emscripten_random(_ctx: &mut Ctx) -> f64 { pub fn _emscripten_random(_ctx: &mut Ctx) -> f64 {
debug!("emscripten::_emscripten_random"); debug!("emscripten::_emscripten_random");
-1.0 -1.0

View File

@ -38,6 +38,7 @@ use libc::{
// writev, // writev,
stat, stat,
write, write,
// readlink,
}; };
use wasmer_runtime_core::vm::Ctx; use wasmer_runtime_core::vm::Ctx;
@ -93,9 +94,8 @@ pub fn ___syscall6(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
// chdir // chdir
pub fn ___syscall12(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall12(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall12 (chdir) {}", _which); debug!("emscripten::___syscall12 (chdir) {}", _which);
let path_addr: i32 = varargs.get(ctx); let path_ptr = varargs.get_str(ctx);
unsafe { unsafe {
let path_ptr = emscripten_memory_pointer!(ctx.memory(0), path_addr) as *const i8;
let _path = std::ffi::CStr::from_ptr(path_ptr); let _path = std::ffi::CStr::from_ptr(path_ptr);
let ret = chdir(path_ptr); let ret = chdir(path_ptr);
debug!("=> path: {:?}, ret: {}", _path, ret); debug!("=> path: {:?}, ret: {}", _path, ret);
@ -122,10 +122,8 @@ pub fn ___syscall20(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
// rename // rename
pub fn ___syscall38(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 { pub fn ___syscall38(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
debug!("emscripten::___syscall38 (rename)"); debug!("emscripten::___syscall38 (rename)");
let old_path_addr: u32 = varargs.get(ctx); let old_path = varargs.get_str(ctx);
let new_path_addr: u32 = varargs.get(ctx); let new_path = varargs.get_str(ctx);
let old_path = emscripten_memory_pointer!(ctx.memory(0), old_path_addr) as *const i8;
let new_path = emscripten_memory_pointer!(ctx.memory(0), new_path_addr) as *const i8;
let result = unsafe { rename(old_path, new_path) }; let result = unsafe { rename(old_path, new_path) };
debug!( debug!(
"=> old_path: {}, new_path: {}, result: {}", "=> old_path: {}, new_path: {}, result: {}",
@ -139,8 +137,7 @@ pub fn ___syscall38(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
// rmdir // rmdir
pub fn ___syscall40(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall40(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall40 (rmdir)"); debug!("emscripten::___syscall40 (rmdir)");
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
unsafe { rmdir(pathname_addr) } unsafe { rmdir(pathname_addr) }
} }
@ -201,9 +198,32 @@ pub fn ___syscall75(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
-1 -1
} }
pub fn ___syscall85(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 { // readlink
debug!("emscripten::___syscall85"); pub fn ___syscall85(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> i32 {
-1 debug!("emscripten::___syscall85 (readlink)");
let _path = varargs.get_str(ctx);
let buf = varargs.get_str(ctx);
// let buf_addr: i32 = varargs.get(ctx);
let buf_size: i32 = varargs.get(ctx);
let fd = 3;
let ret = unsafe { read(fd, buf as _, buf_size as _) as i32 };
debug!(
"=> buf: {}, buf_size: {}, return: {} ",
unsafe { std::ffi::CStr::from_ptr(buf as _).to_str().unwrap() },
buf_size,
ret
);
// let ret = unsafe {
// readlink(path, buf as _, buf_size as _) as i32
// };
// debug!("=> path: {}, buf: {}, buf_size: {}, return: {} ",
// unsafe { std::ffi::CStr::from_ptr(path).to_str().unwrap() },
// unsafe { std::ffi::CStr::from_ptr(buf as _).to_str().unwrap() },
// // std::ffi::CStr::from_ptr(buf).to_str().unwrap(),
// // buf,
// buf_size,
// ret);
ret
} }
pub fn ___syscall91(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 { pub fn ___syscall91(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
@ -397,19 +417,16 @@ pub fn ___syscall199(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 {
// stat64 // stat64
pub fn ___syscall195(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall195(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall195 (stat64) {}", _which); debug!("emscripten::___syscall195 (stat64) {}", _which);
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let buf: u32 = varargs.get(ctx); let buf: u32 = varargs.get(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
unsafe { unsafe {
let mut _stat: stat = std::mem::zeroed(); let mut _stat: stat = std::mem::zeroed();
let ret = stat(pathname_addr, &mut _stat); let ret = stat(pathname_addr, &mut _stat);
debug!( debug!(
"=> pathname: {}, buf: {}, path: {} = {}\nlast os error: {}", "=> pathname: {}, buf: {} = {}, last os error: {}",
pathname,
buf,
std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap(), std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap(),
buf,
ret, ret,
Error::last_os_error() Error::last_os_error()
); );

View File

@ -104,19 +104,17 @@ const SO_NOSIGPIPE: c_int = 0;
/// open /// open
pub fn ___syscall5(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall5(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall5 (open) {}", _which); debug!("emscripten::___syscall5 (open) {}", _which);
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let flags: i32 = varargs.get(ctx); let flags: i32 = varargs.get(ctx);
let mode: u32 = varargs.get(ctx); let mode: u32 = varargs.get(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
let _path_str = unsafe { std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap() }; let _path_str = unsafe { std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap() };
let fd = unsafe { open(pathname_addr, flags, mode) }; let fd = unsafe { open(pathname_addr, flags, mode) };
debug!( debug!(
"=> pathname: {}, flags: {}, mode: {} = fd: {}\npath: {}\nlast os error: {}", "=> path: {}, flags: {}, mode: {} = fd: {}, last os error: {}",
pathname, _path_str,
flags, flags,
mode, mode,
fd, fd,
_path_str,
Error::last_os_error(), Error::last_os_error(),
); );
fd fd
@ -126,10 +124,8 @@ pub fn ___syscall5(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
pub fn ___syscall9(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall9(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall9 (link) {}", _which); debug!("emscripten::___syscall9 (link) {}", _which);
let oldname: c_int = varargs.get(ctx); let oldname_ptr = varargs.get_str(ctx);
let newname: c_int = varargs.get(ctx); let newname_ptr = varargs.get_str(ctx);
let oldname_ptr = emscripten_memory_pointer!(ctx.memory(0), oldname) as *const i8;
let newname_ptr = emscripten_memory_pointer!(ctx.memory(0), newname) as *const i8;
let result = unsafe { link(oldname_ptr, newname_ptr) }; let result = unsafe { link(oldname_ptr, newname_ptr) };
debug!( debug!(
"=> oldname: {}, newname: {}, result: {}", "=> oldname: {}, newname: {}, result: {}",
@ -156,10 +152,8 @@ pub fn ___syscall77(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
pub fn ___syscall83(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall83(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall83 (symlink) {}", _which); debug!("emscripten::___syscall83 (symlink) {}", _which);
let path1_ptr: c_int = varargs.get(ctx); let path1 = varargs.get_str(ctx);
let path2_ptr: c_int = varargs.get(ctx); let path2 = varargs.get_str(ctx);
let path1 = emscripten_memory_pointer!(ctx.memory(0), path1_ptr) as *mut i8;
let path2 = emscripten_memory_pointer!(ctx.memory(0), path2_ptr) as *mut i8;
let result = unsafe { symlink(path1, path2) }; let result = unsafe { symlink(path1, path2) };
debug!( debug!(
"=> path1: {}, path2: {}, result: {}", "=> path1: {}, path2: {}, result: {}",
@ -186,10 +180,9 @@ pub fn ___syscall194(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
/// lchown /// lchown
pub fn ___syscall198(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall198(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall198 (lchown) {}", _which); debug!("emscripten::___syscall198 (lchown) {}", _which);
let path: c_int = varargs.get(ctx); let path_ptr = varargs.get_str(ctx);
let uid: uid_t = varargs.get(ctx); let uid: uid_t = varargs.get(ctx);
let gid: gid_t = varargs.get(ctx); let gid: gid_t = varargs.get(ctx);
let path_ptr = emscripten_memory_pointer!(ctx.memory(0), path) as *const i8;
let result = unsafe { lchown(path_ptr, uid, gid) }; let result = unsafe { lchown(path_ptr, uid, gid) };
debug!( debug!(
"=> path: {}, uid: {}, gid: {}, result: {}", "=> path: {}, uid: {}, gid: {}, result: {}",
@ -222,12 +215,10 @@ pub fn ___syscall205(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
pub fn ___syscall212(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall212(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall212 (chown) {}", _which); debug!("emscripten::___syscall212 (chown) {}", _which);
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let owner: u32 = varargs.get(ctx); let owner: u32 = varargs.get(ctx);
let group: u32 = varargs.get(ctx); let group: u32 = varargs.get(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
unsafe { chown(pathname_addr, owner, group) } unsafe { chown(pathname_addr, owner, group) }
} }
@ -247,9 +238,8 @@ pub fn ___syscall219(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
/// access /// access
pub fn ___syscall33(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall33(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall33 (access) {}", _which); debug!("emscripten::___syscall33 (access) {}", _which);
let path_ptr: c_int = varargs.get(ctx); let path = varargs.get_str(ctx);
let amode: c_int = varargs.get(ctx); let amode: c_int = varargs.get(ctx);
let path = emscripten_memory_pointer!(ctx.memory(0), path_ptr) as *const i8;
let result = unsafe { access(path, amode) }; let result = unsafe { access(path, amode) };
debug!( debug!(
"=> path: {}, amode: {}, result: {}", "=> path: {}, amode: {}, result: {}",
@ -270,9 +260,8 @@ pub fn ___syscall34(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int
// mkdir // mkdir
pub fn ___syscall39(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { pub fn ___syscall39(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall39 (mkdir) {}", _which); debug!("emscripten::___syscall39 (mkdir) {}", _which);
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let mode: u32 = varargs.get(ctx); let mode: u32 = varargs.get(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
unsafe { mkdir(pathname_addr, mode as _) } unsafe { mkdir(pathname_addr, mode as _) }
} }
@ -771,9 +760,8 @@ pub fn ___syscall122(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in
/// lstat64 /// lstat64
pub fn ___syscall196(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { pub fn ___syscall196(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 {
debug!("emscripten::___syscall196 (lstat64) {}", _which); debug!("emscripten::___syscall196 (lstat64) {}", _which);
let path_ptr: c_int = varargs.get(ctx); let path = varargs.get_str(ctx);
let buf_ptr: u32 = varargs.get(ctx); let buf_ptr: u32 = varargs.get(ctx);
let path = emscripten_memory_pointer!(ctx.memory(0), path_ptr) as *const i8;
unsafe { unsafe {
let mut stat: stat = std::mem::zeroed(); let mut stat: stat = std::mem::zeroed();

View File

@ -18,10 +18,9 @@ pub fn ___syscall5(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int {
debug!("emscripten::___syscall5 (open) {}", which); debug!("emscripten::___syscall5 (open) {}", which);
#[cfg(not(feature = "debug"))] #[cfg(not(feature = "debug"))]
let _ = which; let _ = which;
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let flags: i32 = varargs.get(ctx); let flags: i32 = varargs.get(ctx);
let mode: u32 = varargs.get(ctx); let mode: u32 = varargs.get(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
let path_str = unsafe { std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap() }; let path_str = unsafe { std::ffi::CStr::from_ptr(pathname_addr).to_str().unwrap() };
match path_str { match path_str {
"/dev/urandom" => { "/dev/urandom" => {
@ -43,7 +42,7 @@ pub fn ___syscall5(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int {
let fd = unsafe { open(raw_pointer_to_urandom_file, flags, mode) }; let fd = unsafe { open(raw_pointer_to_urandom_file, flags, mode) };
debug!( debug!(
"=> pathname: {}, flags: {}, mode: {} = fd: {}", "=> pathname: {}, flags: {}, mode: {} = fd: {}",
pathname, flags, mode, fd path_str, flags, mode, fd
); );
fd fd
} }
@ -51,7 +50,7 @@ pub fn ___syscall5(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int {
let fd = unsafe { open(pathname_addr, flags, mode) }; let fd = unsafe { open(pathname_addr, flags, mode) };
debug!( debug!(
"=> pathname: {}, flags: {}, mode: {} = fd: {}\npath: {}", "=> pathname: {}, flags: {}, mode: {} = fd: {}\npath: {}",
pathname, flags, mode, fd, path_str path_str, flags, mode, fd, path_str
); );
fd fd
} }
@ -95,8 +94,7 @@ pub fn ___syscall39(ctx: &mut Ctx, which: c_int, mut varargs: VarArgs) -> c_int
debug!("emscripten::___syscall39 (mkdir) {}", which); debug!("emscripten::___syscall39 (mkdir) {}", which);
#[cfg(not(feature = "debug"))] #[cfg(not(feature = "debug"))]
let _ = which; let _ = which;
let pathname: u32 = varargs.get(ctx); let pathname_addr = varargs.get_str(ctx);
let pathname_addr = emscripten_memory_pointer!(ctx.memory(0), pathname) as *const i8;
unsafe { mkdir(pathname_addr) } unsafe { mkdir(pathname_addr) }
} }

View File

@ -4,7 +4,9 @@ use std::mem;
use std::time::SystemTime; use std::time::SystemTime;
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
use libc::{clockid_t, time as libc_time}; use libc::{clockid_t, time as libc_time, timegm as libc_timegm, tm as libc_tm};
#[cfg(not(target_os = "windows"))]
use std::ffi::CString;
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
use libc::time_t; use libc::time_t;
@ -298,6 +300,57 @@ pub fn _time(ctx: &mut Ctx, time_p: u32) -> i32 {
} }
} }
/// emscripten: _timegm
#[cfg(not(target_os = "windows"))]
#[allow(clippy::cast_ptr_alignment)]
pub fn _timegm(ctx: &mut Ctx, time_ptr: u32) -> i32 {
debug!("emscripten::_timegm {}", time_ptr);
unsafe {
let time_p_addr = emscripten_memory_pointer!(ctx.memory(0), time_ptr) as *mut guest_tm;
let x: *mut c_char = CString::new("").expect("CString::new failed").into_raw();
let mut rust_tm = libc_tm {
tm_sec: 0,
tm_min: 0,
tm_hour: 0,
tm_mday: 0,
tm_mon: 0,
tm_year: 0,
tm_wday: 0,
tm_yday: 0,
tm_isdst: 0,
tm_gmtoff: 0,
tm_zone: x,
};
let result = libc_timegm(&mut rust_tm) as i32;
if result != 0 {
(*time_p_addr).tm_sec = rust_tm.tm_sec;
(*time_p_addr).tm_min = rust_tm.tm_min;
(*time_p_addr).tm_hour = rust_tm.tm_hour;
(*time_p_addr).tm_mday = rust_tm.tm_mday;
(*time_p_addr).tm_mon = rust_tm.tm_mon;
(*time_p_addr).tm_year = rust_tm.tm_year;
(*time_p_addr).tm_wday = rust_tm.tm_wday;
(*time_p_addr).tm_yday = rust_tm.tm_yday;
(*time_p_addr).tm_isdst = rust_tm.tm_isdst;
(*time_p_addr).tm_gmtoff = rust_tm.tm_gmtoff as _;
(*time_p_addr).tm_zone = 0;
}
result
}
}
#[cfg(target_os = "windows")]
pub fn _timegm(_ctx: &mut Ctx, _time_ptr: c_int) -> i32 {
debug!(
"emscripten::_timegm - UNIMPLEMENTED IN WINDOWS {}",
_time_ptr
);
-1
}
/// emscripten: _strftime /// emscripten: _strftime
pub fn _strftime( pub fn _strftime(
ctx: &mut Ctx, ctx: &mut Ctx,

View File

@ -1,5 +1,7 @@
use std::mem; use std::mem;
use wasmer_runtime_core::{types::WasmExternType, vm::Ctx}; use wasmer_runtime_core::{types::WasmExternType, vm::Ctx};
// use std::ffi::CStr;
use std::os::raw::c_char;
#[repr(transparent)] #[repr(transparent)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -13,6 +15,14 @@ impl VarArgs {
self.pointer += mem::size_of::<T>() as u32; self.pointer += mem::size_of::<T>() as u32;
unsafe { (ptr as *const T).read() } unsafe { (ptr as *const T).read() }
} }
// pub fn getStr<'a>(&mut self, ctx: &mut Ctx) -> &'a CStr {
pub fn get_str(&mut self, ctx: &mut Ctx) -> *const c_char {
let ptr_addr: u32 = self.get(ctx);
let ptr = emscripten_memory_pointer!(ctx.memory(0), ptr_addr) as *const c_char;
ptr
// unsafe { CStr::from_ptr(ptr) }
}
} }
unsafe impl WasmExternType for VarArgs { unsafe impl WasmExternType for VarArgs {

View File

@ -7,7 +7,7 @@ edition = "2018"
[dependencies] [dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" } wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" }
inkwell = { git = "https://github.com/wasmerio/inkwell", branch = "llvm7-0" } inkwell = { git = "https://github.com/wasmerio/inkwell", branch = "llvm7-0" }
wasmparser = "0.29.2" wasmparser = "0.30.0"
hashbrown = "0.1.8" hashbrown = "0.1.8"
smallvec = "0.6.8" smallvec = "0.6.8"
goblin = "0.0.20" goblin = "0.0.20"

View File

@ -13,11 +13,18 @@ wasmer-runtime-core = { path = "../runtime-core" }
hashbrown = "0.1" hashbrown = "0.1"
failure = "0.1" failure = "0.1"
tar = "0.4" tar = "0.4"
wasmparser = "0.29.2" wasmparser = "0.30.0"
zstd = "0.4" zstd = "0.4"
<<<<<<< HEAD
[target.'cfg(unix)'.dependencies.zbox] [target.'cfg(unix)'.dependencies.zbox]
git = "https://github.com/zboxfs/zbox" git = "https://github.com/zboxfs/zbox"
=======
# [target.'cfg(unix)'.dependencies.zbox]
# git = "https://github.com/wasmerio/zbox"
# branch = "bundle-libsodium"
# features = ["libsodium-bundled"]
>>>>>>> origin/master
[dev-dependencies] [dev-dependencies]
tempdir = "0.3" tempdir = "0.3"

View File

@ -99,12 +99,8 @@ pub unsafe extern "C" fn wasmer_instantiate(
let result = wasmer_runtime::instantiate(bytes, &import_object); let result = wasmer_runtime::instantiate(bytes, &import_object);
let new_instance = match result { let new_instance = match result {
Ok(instance) => instance, Ok(instance) => instance,
Err(_error) => { Err(error) => {
// TODO the trait bound `wasmer_runtime::error::Error: std::error::Error` is not satisfied update_last_error(error);
//update_last_error(error);
update_last_error(CApiError {
msg: "error instantiating".to_string(),
});
return wasmer_result_t::WASMER_ERROR; return wasmer_result_t::WASMER_ERROR;
} }
}; };

View File

@ -10,7 +10,7 @@ edition = "2018"
[dependencies] [dependencies]
nix = "0.12.0" nix = "0.12.0"
page_size = "0.4.1" page_size = "0.4.1"
wasmparser = "0.29.2" wasmparser = "0.30.0"
parking_lot = "0.7.1" parking_lot = "0.7.1"
lazy_static = "1.2.0" lazy_static = "1.2.0"
indexmap = "1.0.2" indexmap = "1.0.2"

View File

@ -9,7 +9,7 @@ edition = "2018"
[dependencies] [dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" } wasmer-runtime-core = { path = "../runtime-core", version = "0.4.2" }
wasmparser = "0.29.2" wasmparser = "0.30.0"
dynasm = "0.3.2" dynasm = "0.3.2"
dynasmrt = "0.3.1" dynasmrt = "0.3.1"
lazy_static = "1.2.0" lazy_static = "1.2.0"