@@ -51,41 +51,35 @@ impl Command {
51
51
// a lock any more because the parent won't do anything and the child is
52
52
// in its own process. Thus the parent drops the lock guard while the child
53
53
// forgets it to avoid unlocking it on a new thread, which would be invalid.
54
- let ( env_lock, result) = unsafe { ( sys:: os:: env_read_lock ( ) , cvt ( libc:: fork ( ) ) ?) } ;
55
-
56
- let pid = unsafe {
57
- match result {
58
- 0 => {
59
- mem:: forget ( env_lock) ;
60
- drop ( input) ;
61
- let Err ( err) = self . do_exec ( theirs, envp. as_ref ( ) ) ;
62
- let errno = err. raw_os_error ( ) . unwrap_or ( libc:: EINVAL ) as u32 ;
63
- let errno = errno. to_be_bytes ( ) ;
64
- let bytes = [
65
- errno[ 0 ] ,
66
- errno[ 1 ] ,
67
- errno[ 2 ] ,
68
- errno[ 3 ] ,
69
- CLOEXEC_MSG_FOOTER [ 0 ] ,
70
- CLOEXEC_MSG_FOOTER [ 1 ] ,
71
- CLOEXEC_MSG_FOOTER [ 2 ] ,
72
- CLOEXEC_MSG_FOOTER [ 3 ] ,
73
- ] ;
74
- // pipe I/O up to PIPE_BUF bytes should be atomic, and then
75
- // we want to be sure we *don't* run at_exit destructors as
76
- // we're being torn down regardless
77
- rtassert ! ( output. write( & bytes) . is_ok( ) ) ;
78
- libc:: _exit ( 1 )
79
- }
80
- n => {
81
- drop ( env_lock) ;
82
- n
83
- }
84
- }
85
- } ;
54
+ let ( env_lock, pid) = unsafe { ( sys:: os:: env_read_lock ( ) , cvt ( libc:: fork ( ) ) ?) } ;
86
55
87
- let mut p = Process { pid, status : None } ;
56
+ if pid == 0 {
57
+ mem:: forget ( env_lock) ;
58
+ drop ( input) ;
59
+ let Err ( err) = unsafe { self . do_exec ( theirs, envp. as_ref ( ) ) } ;
60
+ let errno = err. raw_os_error ( ) . unwrap_or ( libc:: EINVAL ) as u32 ;
61
+ let errno = errno. to_be_bytes ( ) ;
62
+ let bytes = [
63
+ errno[ 0 ] ,
64
+ errno[ 1 ] ,
65
+ errno[ 2 ] ,
66
+ errno[ 3 ] ,
67
+ CLOEXEC_MSG_FOOTER [ 0 ] ,
68
+ CLOEXEC_MSG_FOOTER [ 1 ] ,
69
+ CLOEXEC_MSG_FOOTER [ 2 ] ,
70
+ CLOEXEC_MSG_FOOTER [ 3 ] ,
71
+ ] ;
72
+ // pipe I/O up to PIPE_BUF bytes should be atomic, and then
73
+ // we want to be sure we *don't* run at_exit destructors as
74
+ // we're being torn down regardless
75
+ rtassert ! ( output. write( & bytes) . is_ok( ) ) ;
76
+ unsafe { libc:: _exit ( 1 ) }
77
+ }
78
+
79
+ drop ( env_lock) ;
88
80
drop ( output) ;
81
+
82
+ let mut p = Process { pid, status : None } ;
89
83
let mut bytes = [ 0 ; 8 ] ;
90
84
91
85
// loop to handle EINTR
0 commit comments