From d6b2faeeb47ea04832dbda39cdf33d2a0dbdfcda Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Wed, 1 May 2019 17:05:59 +0200 Subject: [PATCH] Modify fd_prestat to hold C-str together with its length --- .../sandboxed-system-primitives/src/posix.c | 15 +++++++++------ .../sandboxed-system-primitives/src/posix.h | 3 ++- wasmtime-wasi/src/host_impls.rs | 7 +++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/wasmtime-wasi/sandboxed-system-primitives/src/posix.c b/wasmtime-wasi/sandboxed-system-primitives/src/posix.c index 31d379a1b3..95b5846009 100644 --- a/wasmtime-wasi/sandboxed-system-primitives/src/posix.c +++ b/wasmtime-wasi/sandboxed-system-primitives/src/posix.c @@ -274,8 +274,10 @@ static bool fd_prestats_grow( return false; // Mark all new file descriptors as unused. - for (size_t i = pt->size; i < size; ++i) - prestats[i].dir = NULL; + for (size_t i = pt->size; i < size; ++i) { + prestats[i].dir_name = NULL; + prestats[i].dir_name_len = 0; + } pt->prestats = prestats; pt->size = size; } @@ -295,7 +297,8 @@ bool fd_prestats_insert( return false; } - pt->prestats[fd].dir = strdup(dir); + pt->prestats[fd].dir_name = strdup(dir); + pt->prestats[fd].dir_name_len = strlen(dir); rwlock_unlock(&pt->lock); return true; } @@ -310,7 +313,7 @@ static __wasi_errno_t fd_prestats_get_entry( if (fd >= pt->size) return __WASI_EBADF; struct fd_prestat *prestat = &pt->prestats[fd]; - if (prestat->dir == NULL) + if (prestat->dir_name == NULL) return __WASI_EBADF; *ret = prestat; @@ -664,12 +667,12 @@ __wasi_errno_t wasmtime_ssp_fd_prestat_dir_name( rwlock_unlock(&prestats->lock); return error; } - if (path_len != strlen(prestat->dir)) { + if (path_len != prestat->dir_name_len) { rwlock_unlock(&prestats->lock); return EINVAL; } - memcpy(path, prestat->dir, path_len); + memcpy(path, prestat->dir_name, path_len); rwlock_unlock(&prestats->lock); diff --git a/wasmtime-wasi/sandboxed-system-primitives/src/posix.h b/wasmtime-wasi/sandboxed-system-primitives/src/posix.h index b3519da78a..6eb7011f7a 100644 --- a/wasmtime-wasi/sandboxed-system-primitives/src/posix.h +++ b/wasmtime-wasi/sandboxed-system-primitives/src/posix.h @@ -21,7 +21,8 @@ struct fd_entry; struct syscalls; struct fd_prestat { - const char *dir; + const char *dir_name; + size_t dir_name_len; }; struct fd_table { diff --git a/wasmtime-wasi/src/host_impls.rs b/wasmtime-wasi/src/host_impls.rs index eb0bae29e0..c73b1e845a 100644 --- a/wasmtime-wasi/src/host_impls.rs +++ b/wasmtime-wasi/src/host_impls.rs @@ -98,7 +98,7 @@ fn fd_prestats_get_entry( } let prestat = unsafe { &*pt.prestats.add(fd as usize) }; - if prestat.dir == ::std::ptr::null() { + if prestat.dir_name == ::std::ptr::null() { return None; } @@ -133,10 +133,9 @@ pub fn wasmtime_ssp_fd_prestat_get( rwlock_rdlock!(prestats); let ret_code = if let Some(prestat) = fd_prestats_get_entry(prestats, fd) { - (*buf).pr_type = host::__WASI_PREOPENTYPE_DIR; + buf.pr_type = host::__WASI_PREOPENTYPE_DIR; unsafe { - let dir_name = ::std::ffi::CStr::from_ptr((*prestat).dir).to_str().unwrap(); - (*buf).u.dir.pr_name_len = dir_name.len(); + buf.u.dir.pr_name_len = prestat.dir_name_len; } host::__WASI_ESUCCESS } else {