wasmer_wasix/syscalls/wasix/
mod.rs1use super::*;
2
3mod call_dynamic;
4mod callback_signal;
5mod chdir;
6mod closure_allocate;
7mod closure_free;
8mod closure_prepare;
9mod context_create;
10mod context_destroy;
11mod context_switch;
12mod dl_invalid_handle;
13mod dlopen;
14mod dlsym;
15mod epoll_create;
16mod epoll_ctl;
17mod epoll_wait;
18mod fd_dup2;
19mod fd_fdflags_get;
20mod fd_fdflags_set;
21mod fd_pipe;
22mod futex_wait;
23mod futex_wake;
24mod futex_wake_all;
25mod getcwd;
26mod path_open2;
27mod port_addr_add;
28mod port_addr_clear;
29mod port_addr_list;
30mod port_addr_remove;
31mod port_bridge;
32mod port_dhcp_acquire;
33mod port_gateway_set;
34mod port_mac;
35mod port_route_add;
36mod port_route_clear;
37mod port_route_list;
38mod port_route_remove;
39mod port_unbridge;
40mod proc_exec;
41mod proc_exec2;
42mod proc_exec3;
43mod proc_exec4;
44mod proc_exit2;
45mod proc_fork;
46mod proc_fork_env;
47mod proc_id;
48mod proc_join;
49mod proc_parent;
50mod proc_signal;
51mod proc_signals_get;
52mod proc_signals_sizes_get;
53mod proc_snapshot;
54mod proc_spawn;
55mod proc_spawn2;
56mod proc_spawn3;
57mod reflect_signature;
58mod resolve;
59mod sched_yield;
60mod sock_accept;
61mod sock_addr_local;
62mod sock_addr_peer;
63mod sock_bind;
64mod sock_connect;
65mod sock_get_opt_flag;
66mod sock_get_opt_size;
67mod sock_get_opt_time;
68mod sock_join_multicast_v4;
69mod sock_join_multicast_v6;
70mod sock_leave_multicast_v4;
71mod sock_leave_multicast_v6;
72mod sock_listen;
73mod sock_open;
74mod sock_pair;
75mod sock_recv;
76mod sock_recv_from;
77mod sock_send;
78mod sock_send_file;
79mod sock_send_to;
80mod sock_set_opt_flag;
81mod sock_set_opt_size;
82mod sock_set_opt_time;
83mod sock_shutdown;
84mod sock_status;
85mod stack_checkpoint;
86mod stack_restore;
87mod thread_exit;
88mod thread_id;
89mod thread_join;
90mod thread_parallelism;
91mod thread_signal;
92mod thread_sleep;
93mod thread_spawn;
94mod tty_get;
95mod tty_set;
96
97pub use call_dynamic::*;
98pub use callback_signal::*;
99pub use chdir::*;
100pub use closure_allocate::*;
101pub use closure_free::*;
102pub use closure_prepare::*;
103pub use context_create::*;
104pub use context_destroy::*;
105pub use context_switch::*;
106pub use dl_invalid_handle::*;
107pub use dlopen::*;
108pub use dlsym::*;
109pub use epoll_create::*;
110pub use epoll_ctl::*;
111pub use epoll_wait::*;
112pub use fd_dup2::*;
113pub use fd_fdflags_get::*;
114pub use fd_fdflags_set::*;
115pub use fd_pipe::*;
116pub use futex_wait::*;
117pub use futex_wake::*;
118pub use futex_wake_all::*;
119pub use getcwd::*;
120pub use path_open2::*;
121pub use port_addr_add::*;
122pub use port_addr_clear::*;
123pub use port_addr_list::*;
124pub use port_addr_remove::*;
125pub use port_bridge::*;
126pub use port_dhcp_acquire::*;
127pub use port_gateway_set::*;
128pub use port_mac::*;
129pub use port_route_add::*;
130pub use port_route_clear::*;
131pub use port_route_list::*;
132pub use port_route_remove::*;
133pub use port_unbridge::*;
134pub use proc_exec::*;
135pub use proc_exec2::*;
136pub use proc_exec3::*;
137pub use proc_exec4::*;
138pub use proc_exit2::*;
139pub use proc_fork::*;
140pub use proc_fork_env::*;
141pub use proc_id::*;
142pub use proc_join::*;
143pub use proc_parent::*;
144pub use proc_signal::*;
145pub use proc_signals_get::*;
146pub use proc_signals_sizes_get::*;
147pub use proc_snapshot::*;
148pub use proc_spawn::*;
149pub use proc_spawn2::*;
150pub use proc_spawn3::*;
151pub use reflect_signature::*;
152pub use resolve::*;
153pub use sched_yield::*;
154pub use sock_accept::*;
155pub use sock_addr_local::*;
156pub use sock_addr_peer::*;
157pub use sock_bind::*;
158pub use sock_connect::*;
159pub use sock_get_opt_flag::*;
160pub use sock_get_opt_size::*;
161pub use sock_get_opt_time::*;
162pub use sock_join_multicast_v4::*;
163pub use sock_join_multicast_v6::*;
164pub use sock_leave_multicast_v4::*;
165pub use sock_leave_multicast_v6::*;
166pub use sock_listen::*;
167pub use sock_open::*;
168pub use sock_pair::*;
169pub use sock_recv::*;
170pub use sock_recv_from::*;
171pub use sock_send::*;
172pub use sock_send_file::*;
173pub use sock_send_to::*;
174pub use sock_set_opt_flag::*;
175pub use sock_set_opt_size::*;
176pub use sock_set_opt_time::*;
177pub use sock_shutdown::*;
178pub use sock_status::*;
179pub use stack_checkpoint::*;
180pub use stack_restore::*;
181pub use thread_exit::*;
182pub use thread_id::*;
183pub use thread_join::*;
184pub use thread_parallelism::*;
185pub use thread_signal::*;
186pub use thread_sleep::*;
187pub use thread_spawn::*;
188pub use tty_get::*;
189pub use tty_set::*;
190
191use tracing::{Span, debug_span, field, instrument, trace_span};
192use wasmer::WasmRef;
193
194pub(super) fn checked_sock_recv_size<'a, M: MemorySize + 'a>(
195 iovs: impl IntoIterator<Item = WasmRef<'a, __wasi_iovec_t<M>>>,
196 max_sock_recv_size: Option<u64>,
197) -> Result<usize, Errno> {
198 let mut max_size = 0usize;
199 for iovs in iovs {
200 let iovs = iovs.read().map_err(mem_error_to_wasi)?;
201 let buf_len = from_offset::<M>(iovs.buf_len)?;
202 max_size = max_size.checked_add(buf_len).ok_or(Errno::Overflow)?;
203 if let Some(max) = max_sock_recv_size
204 && (max_size as u64) > max
205 {
206 return Err(Errno::Inval);
207 }
208 }
209 Ok(max_size)
210}
211
212#[cfg(all(test, not(target_arch = "wasm32")))]
213mod tests {
214 use super::checked_sock_recv_size;
215 use crate::syscalls::types::{__wasi_iovec_t, wasi::Errno};
216 use wasmer::{Memory, Memory64, MemoryType, Store, WasmRef};
217
218 #[test]
219 fn checked_sock_recv_size_catches_iovec_len_overflow() {
220 let mut store = Store::default();
221 let memory = Memory::new(&mut store, MemoryType::new(1, None, false)).unwrap();
222 let view = memory.view(&store);
223
224 let iovs = [
225 __wasi_iovec_t::<Memory64> {
226 buf: 0,
227 buf_len: usize::MAX as u64,
228 },
229 __wasi_iovec_t::<Memory64> { buf: 0, buf_len: 1 },
230 ];
231 let first_iov = WasmRef::new(&view, 0);
232 let second_iov = WasmRef::new(
233 &view,
234 std::mem::size_of::<__wasi_iovec_t<Memory64>>() as u64,
235 );
236 first_iov.write(iovs[0]).unwrap();
237 second_iov.write(iovs[1]).unwrap();
238
239 let err = checked_sock_recv_size::<Memory64>([first_iov, second_iov], Some(u64::MAX))
240 .unwrap_err();
241
242 assert_eq!(err, Errno::Overflow);
243 }
244}