@@ -528,8 +528,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
528528let o_tmpfile = this. eval_libc_i32 ( "O_TMPFILE" ) ;
529529if flag & o_tmpfile == o_tmpfile {
530530// if the flag contains `O_TMPFILE` then we return a graceful error
531- this. set_last_error ( LibcError ( "EOPNOTSUPP" ) ) ?;
532- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
531+ return this. set_last_error_and_return_i32 ( LibcError ( "EOPNOTSUPP" ) ) ;
533532}
534533}
535534
@@ -548,9 +547,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
548547// O_NOFOLLOW only fails when the trailing component is a symlink;
549548// the entire rest of the path can still contain symlinks.
550549if path. is_symlink ( ) {
551- let eloop = this. eval_libc ( "ELOOP" ) ;
552- this. set_last_error ( eloop) ?;
553- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
550+ return this. set_last_error_and_return_i32 ( LibcError ( "ELOOP" ) ) ;
554551}
555552}
556553 mirror |= o_nofollow;
@@ -565,8 +562,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
565562// Reject if isolation is enabled.
566563if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
567564 this. reject_in_isolation ( "`open`" , reject_with) ?;
568- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
569- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
565+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
570566}
571567
572568let fd = options
@@ -584,8 +580,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
584580let seek_from = if whence == this. eval_libc_i32 ( "SEEK_SET" ) {
585581if offset < 0 {
586582// Negative offsets return `EINVAL`.
587- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
588- return interp_ok ( Scalar :: from_i64 ( -1 ) ) ;
583+ return this. set_last_error_and_return_i64 ( LibcError ( "EINVAL" ) ) ;
589584} else {
590585SeekFrom :: Start ( u64:: try_from ( offset) . unwrap ( ) )
591586}
@@ -594,8 +589,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
594589} else if whence == this. eval_libc_i32 ( "SEEK_END" ) {
595590SeekFrom :: End ( i64:: try_from ( offset) . unwrap ( ) )
596591} else {
597- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
598- return interp_ok ( Scalar :: from_i64 ( -1 ) ) ;
592+ return this. set_last_error_and_return_i64 ( LibcError ( "EINVAL" ) ) ;
599593} ;
600594
601595let communicate = this. machine . communicate ( ) ;
@@ -618,8 +612,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
618612// Reject if isolation is enabled.
619613if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
620614 this. reject_in_isolation ( "`unlink`" , reject_with) ?;
621- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
622- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
615+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
623616}
624617
625618let result = remove_file ( path) . map ( |_| 0 ) ;
@@ -649,8 +642,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
649642// Reject if isolation is enabled.
650643if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
651644 this. reject_in_isolation ( "`symlink`" , reject_with) ?;
652- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
653- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
645+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
654646}
655647
656648let result = create_link ( & target, & linkpath) . map ( |_| 0 ) ;
@@ -674,9 +666,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
674666// Reject if isolation is enabled.
675667if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
676668 this. reject_in_isolation ( "`stat`" , reject_with) ?;
677- let eacc = this. eval_libc ( "EACCES" ) ;
678- this. set_last_error ( eacc) ?;
679- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
669+ return this. set_last_error_and_return_i32 ( LibcError ( "EACCES" ) ) ;
680670}
681671
682672// `stat` always follows symlinks.
@@ -706,9 +696,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
706696// Reject if isolation is enabled.
707697if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
708698 this. reject_in_isolation ( "`lstat`" , reject_with) ?;
709- let eacc = this. eval_libc ( "EACCES" ) ;
710- this. set_last_error ( eacc) ?;
711- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
699+ return this. set_last_error_and_return_i32 ( LibcError ( "EACCES" ) ) ;
712700}
713701
714702let metadata = match FileMetadata :: from_path ( this, & path, false ) ? {
@@ -766,9 +754,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
766754
767755// If the statxbuf or pathname pointers are null, the function fails with `EFAULT`.
768756if this. ptr_is_null ( statxbuf_ptr) ? || this. ptr_is_null ( pathname_ptr) ? {
769- let efault = this. eval_libc ( "EFAULT" ) ;
770- this. set_last_error ( efault) ?;
771- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
757+ return this. set_last_error_and_return_i32 ( LibcError ( "EFAULT" ) ) ;
772758}
773759
774760let statxbuf = this. deref_pointer_as ( statxbuf_op, this. libc_ty_layout ( "statx" ) ) ?;
@@ -809,8 +795,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
809795assert ! ( empty_path_flag) ;
810796 this. eval_libc ( "EBADF" )
811797} ;
812- this. set_last_error ( ecode) ?;
813- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
798+ return this. set_last_error_and_return_i32 ( ecode) ;
814799}
815800
816801// the `_mask_op` parameter specifies the file information that the caller requested.
@@ -939,9 +924,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
939924let newpath_ptr = this. read_pointer ( newpath_op) ?;
940925
941926if this. ptr_is_null ( oldpath_ptr) ? || this. ptr_is_null ( newpath_ptr) ? {
942- let efault = this. eval_libc ( "EFAULT" ) ;
943- this. set_last_error ( efault) ?;
944- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
927+ return this. set_last_error_and_return_i32 ( LibcError ( "EFAULT" ) ) ;
945928}
946929
947930let oldpath = this. read_path_from_c_str ( oldpath_ptr) ?;
@@ -950,8 +933,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
950933// Reject if isolation is enabled.
951934if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
952935 this. reject_in_isolation ( "`rename`" , reject_with) ?;
953- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
954- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
936+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
955937}
956938
957939let result = rename ( oldpath, newpath) . map ( |_| 0 ) ;
@@ -974,8 +956,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
974956// Reject if isolation is enabled.
975957if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
976958 this. reject_in_isolation ( "`mkdir`" , reject_with) ?;
977- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
978- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
959+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
979960}
980961
981962#[ cfg_attr( not( unix) , allow( unused_mut) ) ]
@@ -1002,8 +983,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
1002983// Reject if isolation is enabled.
1003984if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
1004985 this. reject_in_isolation ( "`rmdir`" , reject_with) ?;
1005- this. set_last_error ( ErrorKind :: PermissionDenied ) ?;
1006- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
986+ return this. set_last_error_and_return_i32 ( ErrorKind :: PermissionDenied ) ;
1007987}
1008988
1009989let result = remove_dir ( path) . map ( |_| 0i32 ) ;
@@ -1019,8 +999,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
1019999// Reject if isolation is enabled.
10201000if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
10211001 this. reject_in_isolation ( "`opendir`" , reject_with) ?;
1022- let eacc = this. eval_libc ( "EACCES" ) ;
1023- this. set_last_error ( eacc) ?;
1002+ this. set_last_error ( LibcError ( "EACCES" ) ) ?;
10241003return interp_ok ( Scalar :: null_ptr ( this) ) ;
10251004}
10261005
@@ -1307,14 +1286,12 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
13071286interp_ok ( Scalar :: from_i32 ( result) )
13081287} else {
13091288drop ( fd) ;
1310- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
1311- interp_ok ( Scalar :: from_i32 ( -1 ) )
1289+ this. set_last_error_and_return_i32 ( LibcError ( "EINVAL" ) )
13121290}
13131291} else {
13141292drop ( fd) ;
13151293// The file is not writable
1316- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
1317- interp_ok ( Scalar :: from_i32 ( -1 ) )
1294+ this. set_last_error_and_return_i32 ( LibcError ( "EINVAL" ) )
13181295}
13191296}
13201297
@@ -1391,15 +1368,13 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
13911368let flags = this. read_scalar ( flags_op) ?. to_i32 ( ) ?;
13921369
13931370if offset < 0 || nbytes < 0 {
1394- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
1395- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
1371+ return this. set_last_error_and_return_i32 ( LibcError ( "EINVAL" ) ) ;
13961372}
13971373let allowed_flags = this. eval_libc_i32 ( "SYNC_FILE_RANGE_WAIT_BEFORE" )
13981374 | this. eval_libc_i32 ( "SYNC_FILE_RANGE_WRITE" )
13991375 | this. eval_libc_i32 ( "SYNC_FILE_RANGE_WAIT_AFTER" ) ;
14001376if flags & allowed_flags != flags {
1401- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
1402- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
1377+ return this. set_last_error_and_return_i32 ( LibcError ( "EINVAL" ) ) ;
14031378}
14041379
14051380// Reject if isolation is enabled.
@@ -1436,8 +1411,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
14361411// Reject if isolation is enabled.
14371412if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
14381413 this. reject_in_isolation ( "`readlink`" , reject_with) ?;
1439- let eacc = this. eval_libc ( "EACCES" ) ;
1440- this. set_last_error ( eacc) ?;
1414+ this. set_last_error ( LibcError ( "EACCES" ) ) ?;
14411415return interp_ok ( -1 ) ;
14421416}
14431417
@@ -1574,9 +1548,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
15741548// Reject if isolation is enabled.
15751549if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
15761550 this. reject_in_isolation ( "`mkstemp`" , reject_with) ?;
1577- let eacc = this. eval_libc ( "EACCES" ) ;
1578- this. set_last_error ( eacc) ?;
1579- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
1551+ return this. set_last_error_and_return_i32 ( LibcError ( "EACCES" ) ) ;
15801552}
15811553
15821554// Get the bytes of the suffix we expect in _target_ encoding.
@@ -1592,8 +1564,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
15921564
15931565// If we don't find the suffix, it is an error.
15941566if last_six_char_bytes != suffix_bytes {
1595- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
1596- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
1567+ return this. set_last_error_and_return_i32 ( LibcError ( "EINVAL" ) ) ;
15971568}
15981569
15991570// At this point we know we have 6 ASCII 'X' characters as a suffix.
@@ -1658,17 +1629,14 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
16581629 _ => {
16591630// "On error, -1 is returned, and errno is set to
16601631// indicate the error"
1661- this. set_last_error ( e) ?;
1662- return interp_ok ( Scalar :: from_i32 ( -1 ) ) ;
1632+ return this. set_last_error_and_return_i32 ( e) ;
16631633}
16641634} ,
16651635}
16661636}
16671637
16681638// We ran out of attempts to create the file, return an error.
1669- let eexist = this. eval_libc ( "EEXIST" ) ;
1670- this. set_last_error ( eexist) ?;
1671- interp_ok ( Scalar :: from_i32 ( -1 ) )
1639+ this. set_last_error_and_return_i32 ( LibcError ( "EEXIST" ) )
16721640}
16731641}
16741642
0 commit comments