Skip to content

Commit

Permalink
fix: respect fd_prestat_dir_name path_max_len argument (#6444)
Browse files Browse the repository at this point in the history
prtest:full

Signed-off-by: Roman Volosatovs <[email protected]>
  • Loading branch information
rvolosatovs authored May 25, 2023
1 parent 6fd731d commit 72b641d
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 3 deletions.
16 changes: 16 additions & 0 deletions crates/test-programs/wasi-tests/src/bin/dir_fd_op_failures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ unsafe fn test_fd_dir_ops(dir_fd: wasi::Fd) {
let stat = wasi::fd_filestat_get(dir_fd).expect("failed to fdstat");
assert_eq!(stat.filetype, wasi::FILETYPE_DIRECTORY);

let (pr_fd, pr_name_len) = (3..)
.map_while(|fd| wasi::fd_prestat_get(fd).ok().map(|stat| (fd, stat)))
.find_map(|(fd, wasi::Prestat { tag, u })| {
(tag == wasi::PREOPENTYPE_DIR.raw()).then_some((fd, u.dir.pr_name_len))
})
.expect("failed to find preopen directory");

let mut pr_name = vec![];
let r = wasi::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), 0);
assert_eq!(r, Err(wasi::ERRNO_NAMETOOLONG));

// Test that passing a larger than necessary buffer works correctly
let mut pr_name = vec![0; pr_name_len + 1];
let r = wasi::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), pr_name_len + 1);
assert_eq!(r, Ok(()));

let mut read_buf = vec![0; 128].into_boxed_slice();
let iovec = wasi::Iovec {
buf: read_buf.as_mut_ptr(),
Expand Down
2 changes: 1 addition & 1 deletion crates/wasi-common/src/snapshots/preview_1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
.ok_or_else(|| Error::not_supported())?
.as_bytes();
let path_len = path_bytes.len();
if path_len < path_max_len as usize {
if path_len > path_max_len as usize {
return Err(Error::name_too_long());
}
path.as_array(path_len as u32).copy_from_slice(path_bytes)?;
Expand Down
4 changes: 2 additions & 2 deletions crates/wasi-preview1-component-adapter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -743,10 +743,10 @@ pub unsafe extern "C" fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno {

/// Return a description of the given preopened file descriptor.
#[no_mangle]
pub unsafe extern "C" fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Errno {
pub unsafe extern "C" fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_max_len: Size) -> Errno {
State::with(|state| {
if let Some(preopen) = state.descriptors().get_preopen(fd) {
if preopen.path.len < path_len as usize {
if preopen.path.len > path_max_len as usize {
Err(ERRNO_NAMETOOLONG)
} else {
ptr::copy_nonoverlapping(preopen.path.ptr, path, preopen.path.len);
Expand Down

0 comments on commit 72b641d

Please sign in to comment.