@@ -19,12 +19,15 @@ use wasmtime::{
1919} ;
2020
2121use crate :: constants:: {
22- WASM_FUEL_LIMIT , WASM_INSTANCES_LIMIT , WASM_MEMORIES_LIMIT , WASM_MEMORY_LIMIT_BYTES ,
23- WASM_TABLES_LIMIT , WASM_TABLE_ELEMENTS_LIMIT ,
22+ MAX_KV_VALUE_BYTES , MAX_QUEUE_FILE_BYTES , MAX_QUEUE_MESSAGE_BYTES , WASM_FUEL_LIMIT ,
23+ WASM_INSTANCES_LIMIT , WASM_MEMORIES_LIMIT , WASM_MEMORY_LIMIT_BYTES , WASM_TABLES_LIMIT ,
24+ WASM_TABLE_ELEMENTS_LIMIT ,
2425} ;
2526
2627const PATH_LOCK_RETRIES : usize = 50 ;
2728const PATH_LOCK_RETRY_DELAY_MS : u64 = 10 ;
29+ const HTTP_CONNECT_TIMEOUT_SECS : u64 = 5 ;
30+ const HTTP_TOTAL_TIMEOUT_SECS : u64 = 10 ;
2831
2932struct HostState {
3033 limits : StoreLimits ,
@@ -382,7 +385,12 @@ fn define_hostcalls(linker: &mut Linker<HostState>) -> Result<(), wasmtime::Erro
382385 } ,
383386 "net.http" ,
384387 ) ?;
385- let response = match ureq:: get ( & url) . call ( ) {
388+ let agent: ureq:: Agent = ureq:: Agent :: config_builder ( )
389+ . timeout_connect ( Some ( Duration :: from_secs ( HTTP_CONNECT_TIMEOUT_SECS ) ) )
390+ . timeout_global ( Some ( Duration :: from_secs ( HTTP_TOTAL_TIMEOUT_SECS ) ) )
391+ . build ( )
392+ . into ( ) ;
393+ let response = match agent. get ( & url) . call ( ) {
386394 Ok ( v) => v,
387395 Err ( _) => return Ok ( -1 ) ,
388396 } ;
@@ -426,6 +434,9 @@ fn define_hostcalls(linker: &mut Linker<HostState>) -> Result<(), wasmtime::Erro
426434 else {
427435 return Ok ( -1 ) ;
428436 } ;
437+ if value. len ( ) > MAX_KV_VALUE_BYTES {
438+ return Ok ( -1 ) ;
439+ }
429440 let path = kv_file_path ( & key_bytes) ;
430441 if let Some ( parent) = path. parent ( ) {
431442 if fs:: create_dir_all ( parent) . is_err ( ) {
@@ -510,6 +521,9 @@ fn define_hostcalls(linker: &mut Linker<HostState>) -> Result<(), wasmtime::Erro
510521 else {
511522 return Ok ( -1 ) ;
512523 } ;
524+ if message. len ( ) > MAX_QUEUE_MESSAGE_BYTES {
525+ return Ok ( -1 ) ;
526+ }
513527 let path = queue_file_path ( & topic_bytes) ;
514528 if let Some ( parent) = path. parent ( ) {
515529 if fs:: create_dir_all ( parent) . is_err ( ) {
@@ -521,12 +535,19 @@ fn define_hostcalls(linker: &mut Linker<HostState>) -> Result<(), wasmtime::Erro
521535 Some ( guard) => guard,
522536 None => return Ok ( -1 ) ,
523537 } ;
538+ let current_size = fs:: metadata ( & path) . map ( |m| m. len ( ) ) . unwrap_or ( 0 ) ;
539+ if current_size > MAX_QUEUE_FILE_BYTES {
540+ return Ok ( -1 ) ;
541+ }
524542 let mut file = match OpenOptions :: new ( ) . create ( true ) . append ( true ) . open ( path) {
525543 Ok ( f) => f,
526544 Err ( _) => return Ok ( -1 ) ,
527545 } ;
528546 let mut line = encoded. into_bytes ( ) ;
529547 line. push ( b'\n' ) ;
548+ if current_size. saturating_add ( line. len ( ) as u64 ) > MAX_QUEUE_FILE_BYTES {
549+ return Ok ( -1 ) ;
550+ }
530551 if file. write_all ( & line) . is_err ( ) {
531552 return Ok ( -1 ) ;
532553 }
@@ -563,6 +584,9 @@ fn define_hostcalls(linker: &mut Linker<HostState>) -> Result<(), wasmtime::Erro
563584 Some ( guard) => guard,
564585 None => return Ok ( -1 ) ,
565586 } ;
587+ if fs:: metadata ( & path) . map ( |m| m. len ( ) ) . unwrap_or ( 0 ) > MAX_QUEUE_FILE_BYTES {
588+ return Ok ( -1 ) ;
589+ }
566590 let file = match OpenOptions :: new ( ) . read ( true ) . open ( & path) {
567591 Ok ( f) => f,
568592 Err ( _) => return Ok ( -1 ) ,
0 commit comments