From b69758f67220883a9ce74c3f8771ab495e9c84b4 Mon Sep 17 00:00:00 2001 From: Marcin Mielniczuk Date: Thu, 28 Nov 2019 04:11:32 +0100 Subject: [PATCH] Correctly handle possibly misaligned pointers in readdir (#615) --- crates/test-programs/wasi-tests/src/bin/fd_readdir.rs | 2 +- crates/wasi-common/src/hostcalls_impl/fs.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/test-programs/wasi-tests/src/bin/fd_readdir.rs b/crates/test-programs/wasi-tests/src/bin/fd_readdir.rs index 79c11dcaa8..7c93ab6ee2 100644 --- a/crates/test-programs/wasi-tests/src/bin/fd_readdir.rs +++ b/crates/test-programs/wasi-tests/src/bin/fd_readdir.rs @@ -36,7 +36,7 @@ impl<'a> Iterator for ReadDir<'a> { // Read the data let dirent_ptr = self.buf.as_ptr() as *const wasi_unstable::Dirent; - let dirent = *dirent_ptr; + let dirent = dirent_ptr.read_unaligned(); let name_ptr = dirent_ptr.offset(1) as *const u8; // NOTE Linux syscall returns a NULL-terminated name, but WASI doesn't let namelen = dirent.d_namlen as usize; diff --git a/crates/wasi-common/src/hostcalls_impl/fs.rs b/crates/wasi-common/src/hostcalls_impl/fs.rs index 0d910a34bf..7fc0eedbb8 100644 --- a/crates/wasi-common/src/hostcalls_impl/fs.rs +++ b/crates/wasi-common/src/hostcalls_impl/fs.rs @@ -1088,12 +1088,12 @@ impl Dirent { let sys_dirent = raw.as_mut_ptr() as *mut wasi::__wasi_dirent_t; unsafe { - *sys_dirent = wasi::__wasi_dirent_t { + sys_dirent.write_unaligned(wasi::__wasi_dirent_t { d_namlen: namlen.try_into()?, d_ino: self.ino, d_next: self.cookie, d_type: self.ftype.to_wasi(), - }; + }); } let sys_name = unsafe { sys_dirent.offset(1) as *mut u8 };