@@ -293,6 +293,10 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
293293 iovs : & types:: IovecArray < ' a > ,
294294 ) -> Result < types:: Size , Error > {
295295 let f = self . table ( ) . get_file ( u32:: from ( fd) ) ?;
296+ // Access mode check normalizes error returned (windows would prefer ACCES here)
297+ if !f. access_mode . contains ( FileAccessMode :: READ ) {
298+ Err ( types:: Errno :: Badf ) ?
299+ }
296300 let f = & f. file ;
297301
298302 let iovs: Vec < wiggle:: GuestPtr < [ u8 ] > > = iovs
@@ -364,6 +368,10 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
364368 offset : types:: Filesize ,
365369 ) -> Result < types:: Size , Error > {
366370 let f = self . table ( ) . get_file ( u32:: from ( fd) ) ?;
371+ // Access mode check normalizes error returned (windows would prefer ACCES here)
372+ if !f. access_mode . contains ( FileAccessMode :: READ ) {
373+ Err ( types:: Errno :: Badf ) ?
374+ }
367375 let f = & f. file ;
368376
369377 let iovs: Vec < wiggle:: GuestPtr < [ u8 ] > > = iovs
@@ -436,6 +444,10 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
436444 ciovs : & types:: CiovecArray < ' a > ,
437445 ) -> Result < types:: Size , Error > {
438446 let f = self . table ( ) . get_file ( u32:: from ( fd) ) ?;
447+ // Access mode check normalizes error returned (windows would prefer ACCES here)
448+ if !f. access_mode . contains ( FileAccessMode :: WRITE ) {
449+ Err ( types:: Errno :: Badf ) ?
450+ }
439451 let f = & f. file ;
440452
441453 let guest_slices: Vec < wiggle:: GuestCow < u8 > > = ciovs
@@ -463,6 +475,10 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
463475 offset : types:: Filesize ,
464476 ) -> Result < types:: Size , Error > {
465477 let f = self . table ( ) . get_file ( u32:: from ( fd) ) ?;
478+ // Access mode check normalizes error returned (windows would prefer ACCES here)
479+ if !f. access_mode . contains ( FileAccessMode :: WRITE ) {
480+ Err ( types:: Errno :: Badf ) ?
481+ }
466482 let f = & f. file ;
467483
468484 let guest_slices: Vec < wiggle:: GuestCow < u8 > > = ciovs
0 commit comments