Correctly handle possibly misaligned pointers in readdir (#615)
This commit is contained in:
committed by
Dan Gohman
parent
16b8b3e58d
commit
b69758f672
@@ -36,7 +36,7 @@ impl<'a> Iterator for ReadDir<'a> {
|
|||||||
|
|
||||||
// Read the data
|
// Read the data
|
||||||
let dirent_ptr = self.buf.as_ptr() as *const wasi_unstable::Dirent;
|
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;
|
let name_ptr = dirent_ptr.offset(1) as *const u8;
|
||||||
// NOTE Linux syscall returns a NULL-terminated name, but WASI doesn't
|
// NOTE Linux syscall returns a NULL-terminated name, but WASI doesn't
|
||||||
let namelen = dirent.d_namlen as usize;
|
let namelen = dirent.d_namlen as usize;
|
||||||
|
|||||||
@@ -1088,12 +1088,12 @@ impl Dirent {
|
|||||||
|
|
||||||
let sys_dirent = raw.as_mut_ptr() as *mut wasi::__wasi_dirent_t;
|
let sys_dirent = raw.as_mut_ptr() as *mut wasi::__wasi_dirent_t;
|
||||||
unsafe {
|
unsafe {
|
||||||
*sys_dirent = wasi::__wasi_dirent_t {
|
sys_dirent.write_unaligned(wasi::__wasi_dirent_t {
|
||||||
d_namlen: namlen.try_into()?,
|
d_namlen: namlen.try_into()?,
|
||||||
d_ino: self.ino,
|
d_ino: self.ino,
|
||||||
d_next: self.cookie,
|
d_next: self.cookie,
|
||||||
d_type: self.ftype.to_wasi(),
|
d_type: self.ftype.to_wasi(),
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let sys_name = unsafe { sys_dirent.offset(1) as *mut u8 };
|
let sys_name = unsafe { sys_dirent.offset(1) as *mut u8 };
|
||||||
|
|||||||
Reference in New Issue
Block a user