wasi-common fixes
This commit is contained in:
@@ -215,7 +215,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
|
|
||||||
let host_nread = {
|
let host_nread = {
|
||||||
let mut buf = guest_slices
|
let mut buf = guest_slices
|
||||||
.iter()
|
.iter_mut()
|
||||||
.map(|s| io::IoSliceMut::new(&mut *s))
|
.map(|s| io::IoSliceMut::new(&mut *s))
|
||||||
.collect::<Vec<io::IoSliceMut<'_>>>();
|
.collect::<Vec<io::IoSliceMut<'_>>>();
|
||||||
entry
|
entry
|
||||||
@@ -276,13 +276,11 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
ciovs: &types::CiovecArray<'_>,
|
ciovs: &types::CiovecArray<'_>,
|
||||||
offset: types::Filesize,
|
offset: types::Filesize,
|
||||||
) -> Result<types::Size> {
|
) -> Result<types::Size> {
|
||||||
let mut buf = Vec::new();
|
let mut guest_slices = Vec::new();
|
||||||
for ciov_ptr in ciovs.iter() {
|
for ciov_ptr in ciovs.iter() {
|
||||||
let ciov_ptr = ciov_ptr?;
|
let ciov_ptr = ciov_ptr?;
|
||||||
let ciov: types::Ciovec = ciov_ptr.read()?;
|
let ciov: types::Ciovec = ciov_ptr.read()?;
|
||||||
let guest_slice: GuestSlice<u8> = ciov.buf.as_array(ciov.buf_len).as_slice()?;
|
guest_slices.push(ciov.buf.as_array(ciov.buf_len).as_slice()?);
|
||||||
let slice: &[u8] = &*guest_slice;
|
|
||||||
buf.push(io::IoSlice::new(slice));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let required_rights =
|
let required_rights =
|
||||||
@@ -293,29 +291,37 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
return Err(Errno::Io);
|
return Err(Errno::Io);
|
||||||
}
|
}
|
||||||
|
|
||||||
let host_nwritten = entry
|
let host_nwritten = {
|
||||||
|
let buf: Vec<io::IoSlice> =
|
||||||
|
guest_slices.iter().map(|s| io::IoSlice::new(&*s)).collect();
|
||||||
|
entry
|
||||||
.as_handle(&required_rights)?
|
.as_handle(&required_rights)?
|
||||||
.pwritev(&buf, offset)?
|
.pwritev(&buf, offset)?
|
||||||
.try_into()?;
|
.try_into()?
|
||||||
|
};
|
||||||
Ok(host_nwritten)
|
Ok(host_nwritten)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fd_read(&self, fd: types::Fd, iovs: &types::IovecArray<'_>) -> Result<types::Size> {
|
fn fd_read(&self, fd: types::Fd, iovs: &types::IovecArray<'_>) -> Result<types::Size> {
|
||||||
let mut slices = Vec::new();
|
let mut guest_slices = Vec::new();
|
||||||
for iov_ptr in iovs.iter() {
|
for iov_ptr in iovs.iter() {
|
||||||
let iov_ptr = iov_ptr?;
|
let iov_ptr = iov_ptr?;
|
||||||
let iov: types::Iovec = iov_ptr.read()?;
|
let iov: types::Iovec = iov_ptr.read()?;
|
||||||
let guest_slice = iov.buf.as_array(iov.buf_len).as_slice()?;
|
guest_slices.push(iov.buf.as_array(iov.buf_len).as_slice()?);
|
||||||
let slice = &mut *guest_slice;
|
|
||||||
slices.push(io::IoSliceMut::new(slice));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let required_rights = HandleRights::from_base(types::Rights::FD_READ);
|
let required_rights = HandleRights::from_base(types::Rights::FD_READ);
|
||||||
let entry = self.get_entry(fd)?;
|
let entry = self.get_entry(fd)?;
|
||||||
let host_nread = entry
|
let host_nread = {
|
||||||
|
let mut slices: Vec<io::IoSliceMut> = guest_slices
|
||||||
|
.iter_mut()
|
||||||
|
.map(|s| io::IoSliceMut::new(&mut *s))
|
||||||
|
.collect();
|
||||||
|
entry
|
||||||
.as_handle(&required_rights)?
|
.as_handle(&required_rights)?
|
||||||
.read_vectored(&mut slices)?
|
.read_vectored(&mut slices)?
|
||||||
.try_into()?;
|
.try_into()?
|
||||||
|
};
|
||||||
|
|
||||||
Ok(host_nread)
|
Ok(host_nread)
|
||||||
}
|
}
|
||||||
@@ -414,19 +420,22 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn fd_write(&self, fd: types::Fd, ciovs: &types::CiovecArray<'_>) -> Result<types::Size> {
|
fn fd_write(&self, fd: types::Fd, ciovs: &types::CiovecArray<'_>) -> Result<types::Size> {
|
||||||
let mut slices = Vec::new();
|
let mut guest_slices = Vec::new();
|
||||||
for ciov_ptr in ciovs.iter() {
|
for ciov_ptr in ciovs.iter() {
|
||||||
let ciov_ptr = ciov_ptr?;
|
let ciov_ptr = ciov_ptr?;
|
||||||
let ciov: types::Ciovec = ciov_ptr.read()?;
|
let ciov: types::Ciovec = ciov_ptr.read()?;
|
||||||
let slice = ciov.buf.as_array(ciov.buf_len).as_slice()?;
|
guest_slices.push(ciov.buf.as_array(ciov.buf_len).as_slice()?);
|
||||||
slices.push(io::IoSlice::new(&*slice));
|
|
||||||
}
|
}
|
||||||
let required_rights = HandleRights::from_base(types::Rights::FD_WRITE);
|
let required_rights = HandleRights::from_base(types::Rights::FD_WRITE);
|
||||||
let entry = self.get_entry(fd)?;
|
let entry = self.get_entry(fd)?;
|
||||||
let host_nwritten = entry
|
let host_nwritten = {
|
||||||
|
let slices: Vec<io::IoSlice> =
|
||||||
|
guest_slices.iter().map(|s| io::IoSlice::new(&*s)).collect();
|
||||||
|
entry
|
||||||
.as_handle(&required_rights)?
|
.as_handle(&required_rights)?
|
||||||
.write_vectored(&slices)?
|
.write_vectored(&slices)?
|
||||||
.try_into()?;
|
.try_into()?
|
||||||
|
};
|
||||||
Ok(host_nwritten)
|
Ok(host_nwritten)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -581,7 +590,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
path,
|
path,
|
||||||
false,
|
false,
|
||||||
)?;
|
)?;
|
||||||
let slice = buf.as_array(buf_len).as_slice()?;
|
let mut slice = buf.as_array(buf_len).as_slice()?;
|
||||||
let host_bufused = dirfd.readlink(&path, &mut *slice)?.try_into()?;
|
let host_bufused = dirfd.readlink(&path, &mut *slice)?.try_into()?;
|
||||||
Ok(host_bufused)
|
Ok(host_bufused)
|
||||||
}
|
}
|
||||||
@@ -793,7 +802,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn random_get(&self, buf: &GuestPtr<u8>, buf_len: types::Size) -> Result<()> {
|
fn random_get(&self, buf: &GuestPtr<u8>, buf_len: types::Size) -> Result<()> {
|
||||||
let slice = buf.as_array(buf_len).as_slice()?;
|
let mut slice = buf.as_array(buf_len).as_slice()?;
|
||||||
getrandom::getrandom(&mut *slice).map_err(|err| {
|
getrandom::getrandom(&mut *slice).map_err(|err| {
|
||||||
error!("getrandom failure: {:?}", err);
|
error!("getrandom failure: {:?}", err);
|
||||||
Errno::Io
|
Errno::Io
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ impl From<wiggle::GuestError> for Errno {
|
|||||||
InFunc { .. } => Self::Inval,
|
InFunc { .. } => Self::Inval,
|
||||||
InDataField { .. } => Self::Inval,
|
InDataField { .. } => Self::Inval,
|
||||||
SliceLengthsDiffer { .. } => Self::Fault,
|
SliceLengthsDiffer { .. } => Self::Fault,
|
||||||
|
BorrowCheckerOOM { .. } => Self::Fault,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user