It's wiggle time! (#1202)
* Use wiggle in place of wig in wasi-common This is a rather massive commit that introduces `wiggle` into the picture. We still use `wig`'s macro in `old` snapshot and to generate `wasmtime-wasi` glue, but everything else is now autogenerated by `wiggle`. In summary, thanks to `wiggle`, we no longer need to worry about serialising and deserialising to and from the guest memory, and all guest (WASI) types are now proper idiomatic Rust types. While we're here, in preparation for the ephemeral snapshot, I went ahead and reorganised the internal structure of the crate. Instead of modules like `hostcalls_impl` or `hostcalls_impl::fs`, the structure now resembles that in ephemeral with modules like `path`, `fd`, etc. Now, I'm not requiring we leave it like this, but I reckon it looks cleaner this way after all. * Fix wig to use new first-class access to caller's mem * Ignore warning in proc_exit for the moment * Group unsafes together in args and environ calls * Simplify pwrite; more unsafe blocks * Simplify fd_read * Bundle up unsafes in fd_readdir * Simplify fd_write * Add comment to path_readlink re zero-len buffers * Simplify unsafes in random_get * Hide GuestPtr<str> to &str in path::get * Rewrite pread and pwrite using SeekFrom and read/write_vectored I've left the implementation of VirtualFs pretty much untouched as I don't feel that comfortable in changing the API too much. Having said that, I reckon `pread` and `pwrite` could be refactored out, and `preadv` and `pwritev` could be entirely rewritten using `seek` and `read_vectored` and `write_vectored`. * Add comment about VirtFs unsafety * Fix all mentions of FdEntry to Entry * Fix warnings on Win * Add aux struct EntryTable responsible for Fds and Entries This commit adds aux struct `EntryTable` which is private to `WasiCtx` and is basically responsible for `Fd` alloc/dealloc as well as storing matching `Entry`s. This struct is entirely private to `WasiCtx` and as such as should remain transparent to `WasiCtx` users. * Remove redundant check for empty buffer in path_readlink * Preserve and rewind file cursor in pread/pwrite * Use GuestPtr<[u8]>::copy_from_slice wherever copying bytes directly * Use GuestPtr<[u8]>::copy_from_slice in fd_readdir * Clean up unsafes around WasiCtx accessors * Fix bugs in args_get and environ_get * Fix conflicts after rebase
This commit is contained in:
@@ -47,8 +47,8 @@ impl Descriptor {
|
||||
/// accessed correctly.
|
||||
///
|
||||
/// Here, the `descriptor` field stores the host `Descriptor` object (such as a file descriptor, or
|
||||
/// stdin handle), and accessing it can only be done via the provided `FdEntry::as_descriptor` and
|
||||
/// `FdEntry::as_descriptor_mut` methods which require a set of base and inheriting rights to be
|
||||
/// stdin handle), and accessing it can only be done via the provided `Entry::as_descriptor` and
|
||||
/// `Entry::as_descriptor_mut` methods which require a set of base and inheriting rights to be
|
||||
/// specified, verifying whether the stored `Descriptor` object is valid for the rights specified.
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct Entry {
|
||||
@@ -61,8 +61,8 @@ pub(crate) struct Entry {
|
||||
}
|
||||
|
||||
impl Entry {
|
||||
/// Create an FdEntry with *maximal* possible rights from a given `File`.
|
||||
/// If this is not desired, the rights of the resulting `FdEntry` should
|
||||
/// Create an Entry with *maximal* possible rights from a given `File`.
|
||||
/// If this is not desired, the rights of the resulting `Entry` should
|
||||
/// be manually restricted.
|
||||
pub(crate) fn from(file: fs::File) -> io::Result<Self> {
|
||||
unsafe { determine_type_and_access_rights(&file) }.map(
|
||||
@@ -116,13 +116,13 @@ impl Entry {
|
||||
Self::from(dev_null()?)
|
||||
}
|
||||
|
||||
/// Convert this `FdEntry` into a host `Descriptor` object provided the specified
|
||||
/// `rights_base` and `rights_inheriting` rights are set on this `FdEntry` object.
|
||||
/// Convert this `Entry` into a host `Descriptor` object provided the specified
|
||||
/// `rights_base` and `rights_inheriting` rights are set on this `Entry` object.
|
||||
///
|
||||
/// The `FdEntry` can only be converted into a valid `Descriptor` object if
|
||||
/// The `Entry` can only be converted into a valid `Descriptor` object if
|
||||
/// the specified set of base rights `rights_base`, and inheriting rights `rights_inheriting`
|
||||
/// is a subset of rights attached to this `FdEntry`. The check is performed using
|
||||
/// `FdEntry::validate_rights` method. If the check fails, `Error::ENOTCAPABLE` is returned.
|
||||
/// is a subset of rights attached to this `Entry`. The check is performed using
|
||||
/// `Entry::validate_rights` method. If the check fails, `Error::ENOTCAPABLE` is returned.
|
||||
pub(crate) fn as_descriptor(
|
||||
&self,
|
||||
rights_base: wasi::__wasi_rights_t,
|
||||
@@ -132,13 +132,13 @@ impl Entry {
|
||||
Ok(&self.descriptor)
|
||||
}
|
||||
|
||||
/// Convert this `FdEntry` into a mutable host `Descriptor` object provided the specified
|
||||
/// `rights_base` and `rights_inheriting` rights are set on this `FdEntry` object.
|
||||
/// Convert this `Entry` into a mutable host `Descriptor` object provided the specified
|
||||
/// `rights_base` and `rights_inheriting` rights are set on this `Entry` object.
|
||||
///
|
||||
/// The `FdEntry` can only be converted into a valid `Descriptor` object if
|
||||
/// The `Entry` can only be converted into a valid `Descriptor` object if
|
||||
/// the specified set of base rights `rights_base`, and inheriting rights `rights_inheriting`
|
||||
/// is a subset of rights attached to this `FdEntry`. The check is performed using
|
||||
/// `FdEntry::validate_rights` method. If the check fails, `Error::ENOTCAPABLE` is returned.
|
||||
/// is a subset of rights attached to this `Entry`. The check is performed using
|
||||
/// `Entry::validate_rights` method. If the check fails, `Error::ENOTCAPABLE` is returned.
|
||||
pub(crate) fn as_descriptor_mut(
|
||||
&mut self,
|
||||
rights_base: wasi::__wasi_rights_t,
|
||||
@@ -148,8 +148,8 @@ impl Entry {
|
||||
Ok(&mut self.descriptor)
|
||||
}
|
||||
|
||||
/// Check if this `FdEntry` object satisfies the specified base rights `rights_base`, and
|
||||
/// inheriting rights `rights_inheriting`; i.e., if rights attached to this `FdEntry` object
|
||||
/// Check if this `Entry` object satisfies the specified base rights `rights_base`, and
|
||||
/// inheriting rights `rights_inheriting`; i.e., if rights attached to this `Entry` object
|
||||
/// are a superset.
|
||||
///
|
||||
/// Upon unsuccessful check, `Error::ENOTCAPABLE` is returned.
|
||||
|
||||
@@ -226,3 +226,12 @@ pub fn whence_to_str(whence: __wasi_whence_t) -> &'static str {
|
||||
}
|
||||
|
||||
pub const __WASI_DIRCOOKIE_START: __wasi_dircookie_t = 0;
|
||||
|
||||
impl crate::fdpool::Fd for __wasi_fd_t {
|
||||
fn as_raw(&self) -> u32 {
|
||||
*self
|
||||
}
|
||||
fn from_raw(raw_fd: u32) -> Self {
|
||||
raw_fd
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user