Modify fd_prestat to hold C-str together with its length
This commit is contained in:
@@ -274,8 +274,10 @@ static bool fd_prestats_grow(
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Mark all new file descriptors as unused.
|
// Mark all new file descriptors as unused.
|
||||||
for (size_t i = pt->size; i < size; ++i)
|
for (size_t i = pt->size; i < size; ++i) {
|
||||||
prestats[i].dir = NULL;
|
prestats[i].dir_name = NULL;
|
||||||
|
prestats[i].dir_name_len = 0;
|
||||||
|
}
|
||||||
pt->prestats = prestats;
|
pt->prestats = prestats;
|
||||||
pt->size = size;
|
pt->size = size;
|
||||||
}
|
}
|
||||||
@@ -295,7 +297,8 @@ bool fd_prestats_insert(
|
|||||||
return false;
|
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);
|
rwlock_unlock(&pt->lock);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -310,7 +313,7 @@ static __wasi_errno_t fd_prestats_get_entry(
|
|||||||
if (fd >= pt->size)
|
if (fd >= pt->size)
|
||||||
return __WASI_EBADF;
|
return __WASI_EBADF;
|
||||||
struct fd_prestat *prestat = &pt->prestats[fd];
|
struct fd_prestat *prestat = &pt->prestats[fd];
|
||||||
if (prestat->dir == NULL)
|
if (prestat->dir_name == NULL)
|
||||||
return __WASI_EBADF;
|
return __WASI_EBADF;
|
||||||
|
|
||||||
*ret = prestat;
|
*ret = prestat;
|
||||||
@@ -664,12 +667,12 @@ __wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
|
|||||||
rwlock_unlock(&prestats->lock);
|
rwlock_unlock(&prestats->lock);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
if (path_len != strlen(prestat->dir)) {
|
if (path_len != prestat->dir_name_len) {
|
||||||
rwlock_unlock(&prestats->lock);
|
rwlock_unlock(&prestats->lock);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(path, prestat->dir, path_len);
|
memcpy(path, prestat->dir_name, path_len);
|
||||||
|
|
||||||
rwlock_unlock(&prestats->lock);
|
rwlock_unlock(&prestats->lock);
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ struct fd_entry;
|
|||||||
struct syscalls;
|
struct syscalls;
|
||||||
|
|
||||||
struct fd_prestat {
|
struct fd_prestat {
|
||||||
const char *dir;
|
const char *dir_name;
|
||||||
|
size_t dir_name_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fd_table {
|
struct fd_table {
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ fn fd_prestats_get_entry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let prestat = unsafe { &*pt.prestats.add(fd as usize) };
|
let prestat = unsafe { &*pt.prestats.add(fd as usize) };
|
||||||
if prestat.dir == ::std::ptr::null() {
|
if prestat.dir_name == ::std::ptr::null() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,10 +133,9 @@ pub fn wasmtime_ssp_fd_prestat_get(
|
|||||||
rwlock_rdlock!(prestats);
|
rwlock_rdlock!(prestats);
|
||||||
|
|
||||||
let ret_code = if let Some(prestat) = fd_prestats_get_entry(prestats, fd) {
|
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 {
|
unsafe {
|
||||||
let dir_name = ::std::ffi::CStr::from_ptr((*prestat).dir).to_str().unwrap();
|
buf.u.dir.pr_name_len = prestat.dir_name_len;
|
||||||
(*buf).u.dir.pr_name_len = dir_name.len();
|
|
||||||
}
|
}
|
||||||
host::__WASI_ESUCCESS
|
host::__WASI_ESUCCESS
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user