@@ -85,6 +85,7 @@ impl udp::HostUdpSocket for WasiSocketsCtxView<'_> {
8585 remote_address,
8686 family : socket. address_family ( ) ,
8787 socket_addr_check : socket. socket_addr_check ( ) . cloned ( ) ,
88+ check_send_permit_count : 0 ,
8889 } ;
8990
9091 Ok ( (
@@ -264,20 +265,22 @@ impl udp::HostOutgoingDatagramStream for WasiSocketsCtxView<'_> {
264265 fn check_send ( & mut self , this : Resource < udp:: OutgoingDatagramStream > ) -> SocketResult < u64 > {
265266 let stream = self . table . get_mut ( & this) ?;
266267
267- Ok (
268- if let Poll :: Ready ( _) =
269- pin ! ( stream. inner. ready( Interest :: WRITABLE . add( Interest :: ERROR ) ) )
270- . poll ( & mut Context :: from_waker ( Waker :: noop ( ) ) )
271- {
272- // We don't know how many Tokio will accept, so we make up a
273- // reasonable number here. If we're wrong and `send` returns
274- // `Ok(0)`, the guest will just have to deal with that, e.g. by
275- // looping or returning `EWOULDBLOCK`.
276- 16
277- } else {
278- 0
279- } ,
280- )
268+ let count = if let Poll :: Ready ( _) =
269+ pin ! ( stream. inner. ready( Interest :: WRITABLE . add( Interest :: ERROR ) ) )
270+ . poll ( & mut Context :: from_waker ( Waker :: noop ( ) ) )
271+ {
272+ // We don't know how many Tokio will accept, so we make up a
273+ // reasonable number here. If we're wrong and `send` returns
274+ // `Ok(0)`, the guest will just have to deal with that, e.g. by
275+ // looping or returning `EWOULDBLOCK`.
276+ 16
277+ } else {
278+ 0
279+ } ;
280+
281+ stream. check_send_permit_count = count;
282+
283+ Ok ( count. try_into ( ) . unwrap ( ) )
281284 }
282285
283286 async fn send (
@@ -331,6 +334,14 @@ impl udp::HostOutgoingDatagramStream for WasiSocketsCtxView<'_> {
331334 return Ok ( 0 ) ;
332335 }
333336
337+ if datagrams. len ( ) > stream. check_send_permit_count {
338+ return Err ( SocketError :: trap ( wasmtime:: format_err!(
339+ "unpermitted: argument exceeds permitted size"
340+ ) ) ) ;
341+ }
342+
343+ stream. check_send_permit_count -= datagrams. len ( ) ;
344+
334345 let mut count = 0 ;
335346
336347 for datagram in datagrams {
0 commit comments