@@ -322,28 +322,26 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
322
322
"`getcwd` is only available for the UNIX target family"
323
323
) ;
324
324
325
- match this. machine . isolated_op {
326
- IsolatedOp :: Allow => {
327
- let buf = this. read_scalar ( & buf_op ) ? . check_init ( ) ?;
328
- let size = this. read_scalar ( & size_op ) ? . to_machine_usize ( & * this . tcx ) ? ;
329
- // If we cannot get the current directory, we return null
330
- match env :: current_dir ( ) {
331
- Ok ( cwd ) => {
332
- if this . write_path_to_c_str ( & cwd , buf , size ) ? . 0 {
333
- return Ok ( buf ) ;
334
- }
335
- let erange = this. eval_libc ( "ERANGE" ) ? ;
336
- this . set_last_error ( erange ) ? ;
325
+ if let IsolatedOp :: Reject ( reject_with ) = this. machine . isolated_op {
326
+ let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
327
+ this. set_last_error_from_io_error ( err ) ?;
328
+ this. report_rejected_op ( "getcwd" , reject_with ) ;
329
+ } else {
330
+ let buf = this . read_scalar ( & buf_op ) ? . check_init ( ) ? ;
331
+ let size = this . read_scalar ( & size_op ) ? . to_machine_usize ( & * this . tcx ) ? ;
332
+ // If we cannot get the current directory, we return null
333
+ match env :: current_dir ( ) {
334
+ Ok ( cwd ) => {
335
+ if this. write_path_to_c_str ( & cwd , buf , size ) ? . 0 {
336
+ return Ok ( buf ) ;
337
337
}
338
- Err ( e) => this. set_last_error_from_io_error ( e) ?,
338
+ let erange = this. eval_libc ( "ERANGE" ) ?;
339
+ this. set_last_error ( erange) ?;
339
340
}
340
- }
341
- IsolatedOp :: Reject ( reject_with) => {
342
- let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
343
- this. set_last_error_from_io_error ( err) ?;
344
- this. report_rejected_op ( "getcwd" , reject_with) ;
341
+ Err ( e) => this. set_last_error_from_io_error ( e) ?,
345
342
}
346
343
}
344
+
347
345
Ok ( Scalar :: null_ptr ( & * this. tcx ) )
348
346
}
349
347
@@ -356,24 +354,21 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
356
354
let this = self . eval_context_mut ( ) ;
357
355
this. assert_target_os ( "windows" , "GetCurrentDirectoryW" ) ;
358
356
359
- match this. machine . isolated_op {
360
- IsolatedOp :: Allow => {
361
- let size = u64:: from ( this. read_scalar ( size_op) ?. to_u32 ( ) ?) ;
362
- let buf = this. read_scalar ( buf_op) ?. check_init ( ) ?;
363
-
364
- // If we cannot get the current directory, we return 0
365
- match env:: current_dir ( ) {
366
- Ok ( cwd) =>
367
- return Ok ( windows_check_buffer_size (
368
- this. write_path_to_wide_str ( & cwd, buf, size) ?,
369
- ) ) ,
370
- Err ( e) => this. set_last_error_from_io_error ( e) ?,
371
- }
372
- }
373
- IsolatedOp :: Reject ( reject_with) => {
374
- let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
375
- this. set_last_error_from_io_error ( err) ?;
376
- this. report_rejected_op ( "GetCurrentDirectoryW" , reject_with) ;
357
+ if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
358
+ let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
359
+ this. set_last_error_from_io_error ( err) ?;
360
+ this. report_rejected_op ( "GetCurrentDirectoryW" , reject_with) ;
361
+ } else {
362
+ let size = u64:: from ( this. read_scalar ( size_op) ?. to_u32 ( ) ?) ;
363
+ let buf = this. read_scalar ( buf_op) ?. check_init ( ) ?;
364
+
365
+ // If we cannot get the current directory, we return 0
366
+ match env:: current_dir ( ) {
367
+ Ok ( cwd) =>
368
+ return Ok ( windows_check_buffer_size (
369
+ this. write_path_to_wide_str ( & cwd, buf, size) ?,
370
+ ) ) ,
371
+ Err ( e) => this. set_last_error_from_io_error ( e) ?,
377
372
}
378
373
}
379
374
Ok ( 0 )
@@ -387,24 +382,21 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
387
382
"`getcwd` is only available for the UNIX target family"
388
383
) ;
389
384
390
- match this. machine . isolated_op {
391
- IsolatedOp :: Allow => {
392
- let path = this. read_path_from_c_str ( this. read_scalar ( path_op) ?. check_init ( ) ?) ?;
385
+ if let IsolatedOp :: Reject ( reject_with) = this. machine . isolated_op {
386
+ let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
387
+ this. set_last_error_from_io_error ( err) ?;
388
+ this. report_rejected_op ( "chdir" , reject_with) ;
393
389
394
- match env:: set_current_dir ( path) {
395
- Ok ( ( ) ) => Ok ( 0 ) ,
396
- Err ( e) => {
397
- this. set_last_error_from_io_error ( e) ?;
398
- Ok ( -1 )
399
- }
400
- }
401
- }
402
- IsolatedOp :: Reject ( reject_with) => {
403
- let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
404
- this. set_last_error_from_io_error ( err) ?;
405
- this. report_rejected_op ( "chdir" , reject_with) ;
390
+ Ok ( -1 )
391
+ } else {
392
+ let path = this. read_path_from_c_str ( this. read_scalar ( path_op) ?. check_init ( ) ?) ?;
406
393
407
- Ok ( -1 )
394
+ match env:: set_current_dir ( path) {
395
+ Ok ( ( ) ) => Ok ( 0 ) ,
396
+ Err ( e) => {
397
+ this. set_last_error_from_io_error ( e) ?;
398
+ Ok ( -1 )
399
+ }
408
400
}
409
401
}
410
402
}
@@ -419,25 +411,21 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
419
411
let this = self . eval_context_mut ( ) ;
420
412
this. assert_target_os ( "windows" , "SetCurrentDirectoryW" ) ;
421
413
422
- match this. machine . isolated_op {
423
- IsolatedOp :: Allow => {
424
- let path =
425
- this. read_path_from_wide_str ( this . read_scalar ( path_op ) ? . check_init ( ) ? ) ? ;
414
+ if let IsolatedOp :: Reject ( reject_with ) = this. machine . isolated_op {
415
+ let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
416
+ this . set_last_error_from_io_error ( err ) ? ;
417
+ this. report_rejected_op ( "SetCurrentDirectoryW" , reject_with ) ;
426
418
427
- match env:: set_current_dir ( path) {
428
- Ok ( ( ) ) => Ok ( 1 ) ,
429
- Err ( e) => {
430
- this. set_last_error_from_io_error ( e) ?;
431
- Ok ( 0 )
432
- }
433
- }
434
- }
435
- IsolatedOp :: Reject ( reject_with) => {
436
- let err = Error :: new ( ErrorKind :: NotFound , "rejected due to isolation" ) ;
437
- this. set_last_error_from_io_error ( err) ?;
438
- this. report_rejected_op ( "SetCurrentDirectoryW" , reject_with) ;
419
+ Ok ( 0 )
420
+ } else {
421
+ let path = this. read_path_from_wide_str ( this. read_scalar ( path_op) ?. check_init ( ) ?) ?;
439
422
440
- Ok ( 0 )
423
+ match env:: set_current_dir ( path) {
424
+ Ok ( ( ) ) => Ok ( 1 ) ,
425
+ Err ( e) => {
426
+ this. set_last_error_from_io_error ( e) ?;
427
+ Ok ( 0 )
428
+ }
441
429
}
442
430
}
443
431
}
0 commit comments