From 0b416e14c31d5588ba4e3a05fc9136abdb2dd740 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 11 Jun 2019 17:36:13 +0200 Subject: [PATCH 1/3] Improved syscall220 debug --- lib/emscripten/src/syscalls/mod.rs | 5 ----- lib/emscripten/src/syscalls/unix.rs | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index a65cf48b5..93e41cb69 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -631,11 +631,6 @@ pub fn ___syscall218(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 { -1 } -pub fn ___syscall220(_ctx: &mut Ctx, _one: i32, _two: i32) -> i32 { - debug!("emscripten::___syscall220"); - -1 -} - // fcntl64 pub fn ___syscall221(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_int { debug!("emscripten::___syscall221 (fcntl64) {}", _which); diff --git a/lib/emscripten/src/syscalls/unix.rs b/lib/emscripten/src/syscalls/unix.rs index e5b3acb63..d167953fb 100644 --- a/lib/emscripten/src/syscalls/unix.rs +++ b/lib/emscripten/src/syscalls/unix.rs @@ -74,6 +74,7 @@ use libc::{ SO_REUSEADDR, TIOCGWINSZ, }; +use std::ffi::CStr; use wasmer_runtime_core::vm::Ctx; use crate::utils; @@ -878,6 +879,7 @@ pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { i += 1; } *(dirp.add(pos + 19 + i) as *mut i8) = 0 as i8; + debug!(" => file {}", CStr::from_ptr((dirp.add(pos + 19) as *const i8)).to_str().unwrap()); } pos += offset; } From 6ce4f5dca4117d3a0742440e3dab49c68f404c5a Mon Sep 17 00:00:00 2001 From: Syrus Date: Wed, 12 Jun 2019 00:13:06 +0200 Subject: [PATCH 2/3] Minor fixes --- lib/emscripten/src/syscalls/unix.rs | 3 ++- lib/emscripten/src/unistd.rs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/emscripten/src/syscalls/unix.rs b/lib/emscripten/src/syscalls/unix.rs index d167953fb..51f892335 100644 --- a/lib/emscripten/src/syscalls/unix.rs +++ b/lib/emscripten/src/syscalls/unix.rs @@ -74,6 +74,7 @@ use libc::{ SO_REUSEADDR, TIOCGWINSZ, }; +#[allow(unused_imports)] use std::ffi::CStr; use wasmer_runtime_core::vm::Ctx; @@ -879,7 +880,7 @@ pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { i += 1; } *(dirp.add(pos + 19 + i) as *mut i8) = 0 as i8; - debug!(" => file {}", CStr::from_ptr((dirp.add(pos + 19) as *const i8)).to_str().unwrap()); + debug!(" => file {}", CStr::from_ptr(dirp.add(pos + 19) as *const i8).to_str().unwrap()); } pos += offset; } diff --git a/lib/emscripten/src/unistd.rs b/lib/emscripten/src/unistd.rs index f127e7cc4..08c06ce50 100644 --- a/lib/emscripten/src/unistd.rs +++ b/lib/emscripten/src/unistd.rs @@ -1,6 +1,6 @@ use wasmer_runtime_core::vm::Ctx; -pub fn confstr(_ctx: &mut Ctx, _name: i32, _bufPointer: i32, _len: i32) -> i32 { - debug!("unistd::confstr({}, {}, {})", _name, _bufPointer, _len); +pub fn confstr(_ctx: &mut Ctx, _name: i32, _buf_pointer: i32, _len: i32) -> i32 { + debug!("unistd::confstr({}, {}, {})", _name, _buf_pointer, _len); 0 } From 109acd2fa3befdaf41f9fe73d820e53bd809d589 Mon Sep 17 00:00:00 2001 From: Syrus Date: Wed, 12 Jun 2019 01:01:47 +0200 Subject: [PATCH 3/3] Trying to fix ___syscall220 --- lib/emscripten/src/lib.rs | 5 +++++ lib/emscripten/src/syscalls/unix.rs | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/emscripten/src/lib.rs b/lib/emscripten/src/lib.rs index a96e263f6..ac5a4b282 100644 --- a/lib/emscripten/src/lib.rs +++ b/lib/emscripten/src/lib.rs @@ -76,6 +76,8 @@ lazy_static! { const GLOBAL_BASE: u32 = 1024; const STATIC_BASE: u32 = GLOBAL_BASE; +use ::libc::DIR as libcDIR; + pub struct EmscriptenData<'a> { pub malloc: Func<'a, u32, u32>, pub free: Func<'a, u32>, @@ -83,6 +85,7 @@ pub struct EmscriptenData<'a> { pub memset: Func<'a, (u32, u32, u32), u32>, pub stack_alloc: Func<'a, u32, u32>, pub jumps: Vec>, + pub opened_dirs: HashMap>, pub dyn_call_i: Option>, pub dyn_call_ii: Option>, @@ -224,6 +227,8 @@ impl<'a> EmscriptenData<'a> { memset, stack_alloc, jumps: Vec::new(), + opened_dirs: HashMap::new(), + dyn_call_i, dyn_call_ii, dyn_call_iii, diff --git a/lib/emscripten/src/syscalls/unix.rs b/lib/emscripten/src/syscalls/unix.rs index 51f892335..e6b2860c2 100644 --- a/lib/emscripten/src/syscalls/unix.rs +++ b/lib/emscripten/src/syscalls/unix.rs @@ -851,19 +851,25 @@ pub fn ___syscall196(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { // dirent structure is // i64, i64, u16 (280), i8, [i8; 256] pub fn ___syscall220(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { - debug!("emscripten::___syscall220"); + use super::super::env::get_emscripten_data; + let fd: i32 = varargs.get(ctx); let dirp_addr: i32 = varargs.get(ctx); let count: u32 = varargs.get(ctx); + debug!("emscripten::___syscall220 (getdents) {} {} {}", fd, dirp_addr, count); let dirp = emscripten_memory_pointer!(ctx.memory(0), dirp_addr) as *mut u8; + + let mut opened_dirs = &mut get_emscripten_data(ctx).opened_dirs; + // need to persist stream across calls? - let dir: *mut libc::DIR = unsafe { libc::fdopendir(fd) }; + // let dir: *mut libc::DIR = unsafe { libc::fdopendir(fd) }; + let mut dir = &*opened_dirs.entry(fd).or_insert_with(|| unsafe { Box::new(libc::fdopendir(fd)) }); let mut pos = 0; let offset = 280; while pos + offset <= count as usize { - let dirent = unsafe { readdir(dir) }; + let dirent = unsafe { readdir(**dir) }; if dirent.is_null() { break; }