Merge pull request #2620 from peterhuene/fix-fd-readdir

Fix `fd_readdir` to properly truncate directory entry names.
This commit is contained in:
Peter Huene
2021-02-01 12:29:56 -08:00
committed by GitHub
2 changed files with 6 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
use more_asserts::assert_gt; use more_asserts::assert_gt;
use std::{cmp::min, env, mem, process, slice, str}; use std::{env, mem, process, slice, str};
use wasi_tests::open_scratch_directory; use wasi_tests::open_scratch_directory;
const BUF_LEN: usize = 256; const BUF_LEN: usize = 256;
@@ -59,7 +59,9 @@ unsafe fn exec_fd_readdir(fd: wasi::Fd, cookie: wasi::Dircookie) -> (Vec<DirEntr
let bufused = let bufused =
wasi::fd_readdir(fd, buf.as_mut_ptr(), BUF_LEN, cookie).expect("failed fd_readdir"); wasi::fd_readdir(fd, buf.as_mut_ptr(), BUF_LEN, cookie).expect("failed fd_readdir");
let sl = slice::from_raw_parts(buf.as_ptr(), min(BUF_LEN, bufused)); assert!(bufused <= BUF_LEN);
let sl = slice::from_raw_parts(buf.as_ptr(), bufused);
let dirs: Vec<_> = ReadDir::from_slice(sl).collect(); let dirs: Vec<_> = ReadDir::from_slice(sl).collect();
let eof = bufused < BUF_LEN; let eof = bufused < BUF_LEN;
(dirs, eof) (dirs, eof)

View File

@@ -304,7 +304,6 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
let dirent_len: types::Size = dirent_raw.len().try_into()?; let dirent_len: types::Size = dirent_raw.len().try_into()?;
let name_raw = name.as_bytes(); let name_raw = name.as_bytes();
let name_len = name_raw.len().try_into()?; let name_len = name_raw.len().try_into()?;
let offset = dirent_len.checked_add(name_len).ok_or(Error::Overflow)?;
// Copy as many bytes of the dirent as we can, up to the end of the buffer. // Copy as many bytes of the dirent as we can, up to the end of the buffer.
let dirent_copy_len = min(dirent_len, buf_len - bufused); let dirent_copy_len = min(dirent_len, buf_len - bufused);
@@ -318,6 +317,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
} }
buf = buf.add(dirent_copy_len)?; buf = buf.add(dirent_copy_len)?;
bufused += dirent_copy_len;
// Copy as many bytes of the name as we can, up to the end of the buffer. // Copy as many bytes of the name as we can, up to the end of the buffer.
let name_copy_len = min(name_len, buf_len - bufused); let name_copy_len = min(name_len, buf_len - bufused);
@@ -331,8 +331,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
} }
buf = buf.add(name_copy_len)?; buf = buf.add(name_copy_len)?;
bufused += name_copy_len;
bufused += offset;
} }
Ok(bufused) Ok(bufused)